0

我在 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
4

3 回答 3

2

您只需要使用聚合ID每个名称MIN()

SELECT  MIN(ID) ID, Name
FROM    tableName
GROUP   BY Name
于 2013-04-04T13:06:03.530 回答
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 名称集。这就是聚合/全外连接子查询的作用。结果是一组所有匹配的 id 对(包括身份)。

然后,使用与 的聚合从这些对中提取最小 id min(),这个 id 是为最终连接选择的一个,以获取与该集合对应的所有行。

于 2013-04-04T13:26:21.040 回答
0

通过简单地执行此操作,所有不同的名称将与分配给它的最小 ID 一起显示:

SELECT  DISTINCT Name , MIN(ID) ID
FROM    tableName
Group BY NAME
于 2013-04-04T13:15:34.007 回答