sql - SQL 中有没有一种方法可以跨行聚合列,并可能基于 Redshift 中的另一个字段值重复行?
问题描述
所以我有一个表,我们称之为 shipping_items,它按 shipping_id 列出装运中包含的各个项目及其数量。
+-------------+-------------+----------+
| shipment_id | item_name | quantity |
+-------------+-------------+----------+
| 1 | cleanser | 1 |
| 1 | moisturizer | 2 |
| 2 | cleanser | 2 |
| 2 | body wash | 1 |
| 3 | cleanser | 1 |
| 3 | moisturizer | 2 |
| 4 | cleanser | 1 |
| 4 | moisturizer | 1 |
+-------------+-------------+----------+
我想要的是返回一个看起来像这样的表
+------------------------------------+----------+
| items | num_ship |
+------------------------------------+----------+
| cleanser, moisturizer, moisturizer | 2 |
| body wash, cleanser, cleanser | 1 |
| cleanser, moisturizer | 1 |
+------------------------------------+----------+
sql中有没有办法做到这一点?我正在考虑 list_agg,但棘手的部分是根据数量字段复制 item_names。我想在新表中显示的是,有 2 批货物包含 2 种保湿剂和 1 种清洁剂,1 批货物包含 2 种清洁剂和 1 种沐浴露。
** 编辑 ** 感谢@Gordon Linoff 解决
新的结果表将如下所示
+------------------------------------+----------+
| items | num_ship |
+------------------------------------+----------+
| cleanser: 1, moisturizer: 2 | 2 |
| body wash: 1, cleanser: 2 | 1 |
| cleanser: 1, moisturizer: 1 | 1 |
解决方案
您可以使用listagg()
:
select listagg(item_name, ', ') within group (order by item_name) as items,
quantity
from t
group by quantity
order by quantity desc;
编辑:
我认为您需要两个级别的聚合:
select items, count(*)
from (select shipment_id,
listagg(distinct item_name, ', ') within group (order by item_name) as items
from t
group by shipment_id
) s
group by items
order by count(*) desc;
这不包括项目列表中的重复项。
编辑二:
对于完全匹配,包括数量:
select items, count(*)
from (select shipment_id,
listagg(distinct item_name || ':' || quantity, ', ') within group (order by item_name) as items
from t
group by shipment_id
) s
group by items
order by count(*) desc;
推荐阅读
- rust - 返回对内部集合的引用时的迭代器生命周期问题
- c - 我在带有 while 循环的程序中找不到错误
- php - sendmail 错误 输入邮件,以“.”结尾 单独在一条线上
- php - ajax 的问题 - 将everythink 发送到链接栏,如 GET 选项
- java - 输入双精度时线程“主”java.util.InputMismatchException 中的异常
- python - 无法使用 file.readlines() 读取原始电子邮件数据
- javascript - 如何将导航从 stackNavigator 传递到屏幕组件
- python - 从给予者角落生成地理坐标
- java - 我已经为 servlet 设置了 tomcat 的类路径,但是我的程序找不到符号错误请给我解决方案
- php - 将具有特定值的元素移动到维度数组的末尾