我在SQL Server中有一个表,其中包含以下记录:
ID Name
---------------------
1 CTSH
1 JPMC
1 CSFB
2 CSFB
2 JPMC
2 CTSH
3 CTSH
3 MSSB
4 CTSH
4 JPMC
4 CSFB
5 CTSH
5 MSSB
我想根据名字找出所有不同的群组。例如,ID为1的所有名称与ID为2和4的名称完全相同。在这种情况下,我只想选择ID 1的所有记录。
以下是我的最终输出结果:
ID Name
---------------------
1 CTSH
1 JPMC
1 CSFB
3 MSSB
3 CTSH
答案 0 :(得分:2)
答案 1 :(得分:0)
通过简单地执行此操作,将显示所有不同的名称以及分配给它的最小ID:
SELECT DISTINCT Name , MIN(ID) ID
FROM tableName
Group BY NAME
答案 2 :(得分:0)
这很复杂,因为你试图匹配两组。以下是使用full outer join
:
select *
from t
where t.id in (
select distinct min(a.id) as idunique
from (select t1.id, t2.id
from (select t.*, count(*) over (partition by id) as NumNames
from t
) t1 full outer join
(select t.*, count(*) over (partition by id) as NumNames
from t
) t2
on t1.name = t2.name
group by t1.id, t2.id
having count(*) = t1.NumNames and count(*) = t2.NumNames
) a
group by t2.id
)
好的,这很复杂。当所有名称匹配时,两个id具有asme名称集,并且匹配名称的数量是每个名称上的名称数。这就是aggregation / full-outer-join子查询的作用。结果是一组匹配的所有id(包括标识)。
然后,使用与min()
的聚合从这些对中提取最小id,并且此id是为最终连接选择的id,以获取与该集合对应的所有行。