2013-04-04 2 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 

Я хочу, чтобы выяснить, все различные группы, основанные на имени. Например, все Имена с идентификатором 1 точно такие же, как имя с идентификатором 2 и 4. В этом случае я хотел бы выбрать все записи только для идентификатора 1.

Вот как мой окончательный результат должен выглядеть следующим образом:

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

ответ

2

Вам просто нужно агрегировать ID для каждого имени с помощью MIN()

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

Я отредактировал окончательный результат, который я пропустил по-настоящему. Кроме того, этот идентификатор может не быть числовым. Задача здесь - найти отличную группу. – Vipin

0

По просто делаю все это агломерация имена будут отображаться вместе с их мин 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 
) 

Хорошо, это довольно сложно. Два идентификатора имеют набор имен asme, когда все имена совпадают, а число совпадающих имен - это количество имен на каждом из них. Это то, что делает подзапрос агрегации/полного внешнего соединения. Результатом является набор всех пар идентификаторов, которые соответствуют (включая идентификатор).

Затем минимальный идентификатор извлекается из этих пар, используя агрегацию с min(), и этот идентификатор выбирается для окончательного соединения, чтобы получить все строки, соответствующие этому набору.

+0

Привет, Гордан - Я пытался запустить этот запрос, но не работал. Любая идея с обновленным набором результатов? Есть ли способ использовать самостоятельное соединение для получения предполагаемого результата? – Vipin

Смежные вопросы