2013-04-04 22 views
0

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

回答

2

你只需要使用MIN()

SELECT MIN(ID) ID, Name 
FROM tableName 
GROUP BY Name 
+0

我已經編輯我錯過intially最終輸出。此外,此ID可能不是數字。挑戰在於找出不同的羣體。 – Vipin 2013-04-04 14:58:55

0

通過聚集的ID爲每名乾脆就這麼做了tinct名稱將分配給它自己的ID最小顯示沿:

SELECT DISTINCT Name , MIN(ID) ID 
FROM tableName 
Group BY NAME 
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具有一組名稱,並且匹配名稱的數量是每個名稱的數量。這是聚合/完全外連接子查詢所做的。結果是一組匹配的所有ID(包括標識)。

然後,最小內徑是從這些對提取,使用聚合與min(),而這個ID是選取作爲最終加入得到相應於該組中的所有行的一個。

+0

嗨戈爾丹 - 我試圖運行此查詢,但沒有奏效。任何想法與更新的結果集?有沒有什麼方法可以使用自連接來獲得預期的結果? – Vipin 2013-04-05 13:40:52