首页 > 解决方案 > 在 SQL 中识别不同的行集

问题描述

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

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

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

在下面的示例中,我想将所有出现的只有红色和蓝色标识为集合 1,将绿色和黄色标识为集合 2 等。映射中的行/值的数量是无限的,因此旋转然后分组/连接不会是合适的。

在此处输入图像描述

解决这个问题的最简单方法是什么?

标签: sqltsqlazure-sql-databaseazure-sql

解决方案


最简单的方法实际上是字符串聚合。在标准 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 Server 中,语法将使用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;

推荐阅读