我想唯一标识使用相同分组的行组。
例如,如果我们想象一些 epos 数据,我想识别购买了完全相同的商品组合的客户,并将它们全部与集合的定义相关联(参见下面的示例)。
这感觉像是一个窗口函数问题,但我仍在试图弄清楚如何使用它们来识别行的唯一组合,而不是按客户或项目进行分区。
在下面的示例中,我想将所有出现的只有红色和蓝色标识为集合 1,将绿色和黄色标识为集合 2 等。映射中的行/值的数量是无限的,因此旋转然后分组/连接不会是合适的。
解决这个问题的最简单方法是什么?
我想唯一标识使用相同分组的行组。
例如,如果我们想象一些 epos 数据,我想识别购买了完全相同的商品组合的客户,并将它们全部与集合的定义相关联(参见下面的示例)。
这感觉像是一个窗口函数问题,但我仍在试图弄清楚如何使用它们来识别行的唯一组合,而不是按客户或项目进行分区。
在下面的示例中,我想将所有出现的只有红色和蓝色标识为集合 1,将绿色和黄色标识为集合 2 等。映射中的行/值的数量是无限的,因此旋转然后分组/连接不会是合适的。
解决这个问题的最简单方法是什么?
最简单的方法实际上是字符串聚合。在标准 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;