2012-04-30 2 views
2

Допустим, есть таблица вроде этого:эффективный способ сделать очень сложные SQL Группировка:

ID | Type | Reference #1 | Reference #2 
0 | 1 | [A]   | {a} 
1 | 2 | [B]   | {b} 
2 | 2 | [B]   | {c} 
3 | 1 | [C]   | {d} 
4 | 1 | [D]   | {d} 
5 | 1 | [E]   | {d} 
6 | 1 | [C]   | {e} 

Есть ли хороший способ группе «Reference # 1» и «Ссылка # 2» в качестве «запасного варианта », из-за отсутствия лучшего способа положить его ...

Например, я хотел бы, чтобы сгруппировать следующие идентификаторы вместе:

{0} [Unique Reference #1], 
{1,2} [Same Reference #1], 
{3,4,5,6} [{3,4,5} have same Reference #2 and {3,6} have same Reference #1] 

Я в полной растерянности относительно того, как сделать это ... Есть предположения?

+0

Вы предлагаете COUNT ссылки 1 что-то заказать? – Randy

+0

Я бы точно не знал, как это сделать, но я думаю, вам понадобится внешнее объединение двух отдельных операторов выбора для достижения того, чего вы хотите ... – MarioDS

+0

да! исправлено сейчас, спасибо! – nosirrahcd

ответ

3

В запросе mellamokb группировки зависят от порядка ввода.

ie.

VALUES 
    (0, 1, '[A]', '{a}'), 
    (1, 2, '[B]', '{b}'), 
    (2, 2, '[B]', '{c}'), 
    (3, 1, '[C]', '{d}'), // group 3 
    (4, 1, '[D]', '{d}'), // group 3 
    (5, 1, '[E]', '{d}'), // group 3 
    (6, 1, '[C]', '{e}'); // group 3 

производит различный результат tahn

VALUES 
    (0, 1, '[A]', '{a}'), 
    (1, 2, '[B]', '{b}'), 
    (2, 2, '[B]', '{c}'), 
    (3, 1, '[C]', '{e}'), //group 3 
    (4, 1, '[D]', '{d}'), // group 4 
    (5, 1, '[E]', '{d}'), // group 4 
    (6, 1, '[C]', '{d}'); // group 3 

Это может быть предназначен, если есть естественный порядок ссылки, которые вы могли бы указать, но его проблема, если они не являются. Способ «решить» эту или указать другую проблему состоит в том, чтобы сказать, что все равные Reference1 создают набор элементов, элементы которых сами по себе и те элементы, чей Reference2 равен , по крайней мере один член этого набора.

В SQL:

with groupings as (
    select 
    ID,Reference1,Reference2, 
    (select min(ID) from Table1 t2 
    where t2.Reference1=t1.Reference1 or t2.Reference2=t1.Reference2) as minID 
    from 
    Table1 t1 
) 
select 
    t1.ID,t1.Reference1,t1.Reference2,t1.minid as round1, 
    (select min(t2.minid) from 
      groupings t2 
     INNER JOIN groupings t3 ON t1.Reference2=t2.Reference2 
) as minID 
    from 
    groupings t1 

Это должно произвести полную группировку каждый раз.

+0

+1 Да, я думаю, что это отличное улучшение. – mellamokb

+0

Отличный ответ! Спасибо – nosirrahcd

+0

Я удалил свой ответ, поскольку он частично неверен, и это гораздо лучший ответ. – mellamokb

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