识别 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;
我想唯一标识使用相同分组的行组。
例如,如果我们想象一些 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;