在SQL Server中的表中查找不同的组

时间:2013-04-04 13:03:27

标签: 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           CSFB
5           CTSH
5           MSSB

我想根据名字找出所有不同的群组。例如,ID为1的所有名称与ID为2和4的名称完全相同。在这种情况下,我只想选择ID 1的所有记录。

以下是我的最终输出结果:

ID              Name
---------------------
1           CTSH
1           JPMC
1           CSFB
3           MSSB
3           CTSH

3 个答案:

答案 0 :(得分:2)

您只需使用ID

为每个名称汇总MIN()
SELECT  MIN(ID) ID, Name
FROM    tableName
GROUP   BY Name

答案 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,以获取与该集合对应的所有行。