我有一个包含两列(Person和Item)的数据集,我想基于列1生成一个组列(Group),但该组将扩展到包括与列2具有相同值的行.

样本1—因为1和2都有a和b,所以它们被认为是1组.3是分开的,因为它是唯一一个与项目a.

Person Item Group
1 a 1
1 b 1
2 a 1
2 b 1
3 a 2

样本2—因为1和2有不同的项目,所以它们被认为是单独的组.3也是分开的,即使它有相同的"a"项,因为它是唯一的项.

Person Item Group
1 a 1
1 b 1
2 c 2
2 d 2
3 a 3

样本3—1和2具有相同的项目,因此它们都被视为1组

Person Item Group
1 a 1
1 b 1
1 c 1
2 a 1
2 b 1
2 c 1

我发现了一个类似的帖子,但这没有相同的分组/判断机制在第二栏: Group identifiers/values that are related with each other between multiple columns

我在想我需要做一个基于Item的自连接并循环通过它,但到目前为止有点卡住了.

提前感谢!

推荐答案

确定每个人的项目集合,然后按集合分组.

with t (person, item) as (
select 1, 'a' union all
select 1, 'b' union all
select 2, 'a' union all
select 2, 'b' union all
select 3, 'a'
)
, person_to_itemset as (
select person, string_agg(item,',') within group (order by item) as itemset
from t
group by person
)
, itemset_to_group as (
select itemset, row_number() over (order by min(person)) grp
from person_to_itemset
group by itemset
)
select t.*, ig.grp
from t
join person_to_itemset pi on t.person = pi.person
join itemset_to_group ig on pi.itemset = ig.itemset

person item grp
1 a 1
1 b 1
2 a 1
2 b 1
3 a 2

fiddle

(请注意,string_agg函数仅用于演示目的.为了安全地工作,item列必须不包含逗号字符,它可能不会表现良好的大量item每个人.可以 Select 直接插入集合类型,不幸的是,我实际上不使用SQL Server,不确定它是否支持某些集合,包括分组的相等比较能力,无论items每person个表单集还是多集也很重要.

Sql相关问答推荐

Select 最大值,但当并列时,从其他列 Select 最大值

SQL基于多个值 Select 单行

如何优化我的功能以减少花费的时间?

获得第三名或最老的记录

如何从Spark SQL的JSON列中提取动态数量的键值对

SQL按日期分组字段和如果日期匹配则求和

合并分层表SQL中的第一个非空、变化的空位置

MS Access问题查询中的自定义字段

如何使用聚合连接两个表

如何在T-SQL中编写row_number的WHERE子句?

如何判断小数点后千位是否不为0

DB2 SQL查询结果多余数据

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

MIN MAX 值与条件绑定

如何仅在满足条件时才按顺序在 SQL 中计数?

在 sql 中合并系列以删除重复项

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?

从 JSON 数组中移除对象