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

2 つのセットを一致させようとしているため、これはかなり複雑です。を使用して、これにアプローチする1つの方法を次に示します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
  )

わかりました、これはかなり複雑です。すべての名前が一致し、一致する名前の数がそれぞれの名前の数である場合、2 つの ID は名前の asme セットを持ちます。これは、集約/完全外部結合サブクエリが行うことです。結果は、一致する ID のすべてのペア (ID を含む) のセットです。

次に、 との集約を使用して、これらのペアから最小の ID が抽出されます。min()この ID は、そのセットに対応するすべての行を取得するための最終的な結合用に選択された 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 に答える