识别 SQL 中的不同行集

Identifying distinct sets of rows in SQL

我想唯一标识使用相同分组的行组。

例如,如果我们想象一些 epos 数据,我想确定购买完全相同的项目组合的客户,将它们全部与集合的定义相关联(参见下面的示例)。

这感觉像是一个 window 函数问题,但我仍在尝试弄清楚如何使用它们来识别行的唯一组合,而不是按客户或项目进行分区。

在下面的示例中,我想将所有仅出现的红色和蓝色标识为第 1 组,将绿色和黄色标识为第 2 组等。映射中 rows/values 的数量是无限的,因此旋转和那么grouping/joining就不合适了

最简单的方法是什么?

最简单的方法其实就是字符串聚合。在标准 SQL 中,它看起来像:

select items,
       listagg(customerid, ',') within group (order by customerid) as customerids,
       row_number() over (order by items) as group_id
from (select customerid, 
             listagg(item, ',') within group (order by item) as items
      from t
     ) c
group by items;

结果集与您指定的不完全相同,因为 ID 组合在一行中。

编辑:

在 SQL 服务器中,语法将使用 string_agg():

select items,
       string_agg(customerid, ',') within group (order by customerid) as customerids,
       row_number() over (order by items) as group_id
from (select customerid, 
             string_agg(item, ',') within group (order by item) as items
      from t
     ) c
group by items;