SQL中是否有一种方法可以跨行聚合列,并基于红移中的另一个字段值聚合可能重复的行?

SQL中是否有一种方法可以跨行聚合列,并基于红移中的另一个字段值聚合可能重复的行?,sql,amazon-redshift,Sql,Amazon Redshift,因此,我有一个表,我们称之为Shipping\u items,它按装运id列出装运中包含的各个项目及其数量 +-------------+-------------+----------+ | shipment_id | item_name | quantity | +-------------+-------------+----------+ | 1 | cleanser | 1 | | 1 | moisturizer |

因此,我有一个表,我们称之为Shipping\u items,它按装运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 |
+------------------------------------+----------+
+------------------------------------+----------+
|               items                | num_ship |
+------------------------------------+----------+
| cleanser: 1, moisturizer: 2        |        2 |
| body wash: 1, cleanser: 2          |        1 |
| cleanser: 1, moisturizer: 1        |        1 |
sql中有什么方法可以做到这一点吗?我正在考虑使用list_agg,但棘手的是根据quantity字段复制项目名称。我想在新表中展示的是,有两批产品包含两种保湿霜和一种洁面乳,还有一批产品包含两种洁面乳和一种沐浴露

**编辑** 多亏了@Gordon Linoff

新的结果表如下所示

+------------------------------------+----------+
|               items                | num_ship |
+------------------------------------+----------+
| cleanser, moisturizer, moisturizer |        2 |
| body wash, cleanser, cleanser      |        1 |
| cleanser, moisturizer              |        1 |
+------------------------------------+----------+
+------------------------------------+----------+
|               items                | num_ship |
+------------------------------------+----------+
| cleanser: 1, moisturizer: 2        |        2 |
| body wash: 1, cleanser: 2          |        1 |
| cleanser: 1, moisturizer: 1        |        1 |
您可以使用
listag()

编辑:

我认为您需要两个级别的聚合:

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;

我不认为这能完全满足我的要求。我编辑了这篇文章,使它更清晰一些,但我试图先按装运进行分组,但也会根据数量复制一个项目名称。这是按数量分组的,它不会告诉我有多少货物与特定的项目组合一起发货编辑的一个比较接近,但是没有办法在项目列表中获得重复项吗?例如,如果一批产品包含1种清洁剂和1种保湿剂,我不希望将其与1种清洁剂和2种保湿剂组合在一起。刚刚编辑了这个问题,添加了一个例子来说明我的意思。我感谢你的帮助@丹。这只是对查询的一个调整。在items字符串中包含数量。哦,这是一个非常简单的解决方案!而且肯定比我想象的更优雅