在SQL Server中的表中查找不同的组
我在SQL Server中有一个表,其中包含以下记录:在SQL Server中的表中查找不同的组,sql,sql-server,Sql,Sql Server,我在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
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
您只需使用
MIN()
SELECT DISTINCT Name , MIN(ID) ID
FROM tableName
Group BY NAME
这是相当复杂的,因为你试图匹配两组。下面是一种方法,使用
完全外部联接
:
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名称集,且匹配名称的数量为每个ID上的名称数量。这就是聚合/完全外部联接子查询所做的。结果是一组匹配的所有ID对(包括标识)
然后,使用与
min()
的聚合,从这些对中提取最小id,该id是为最终联接选择的id,以获取与该集合对应的所有行。我编辑了最初错过的最终输出。此外,此ID可能不是数字。这里的挑战是找出不同的组。嗨,Gordan-我试图运行这个查询,但没有成功。有更新结果集的想法吗?是否有任何方法可以使用自连接来获得预期的结果?
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
)