Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中的表中查找不同的组_Sql_Sql Server - Fatal编程技术网

在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

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

您只需使用
MIN()


只需执行此操作,即可显示所有不同的名称及其分配的最小ID:

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
  )