2015-11-30 4 views
0

У меня есть таблица, которая выглядит, как этотT-SQL Находит первое вхождение уникальных комбинаций

Log_ID User_ID Line Attribute 
1  A  1  **** 
1  B  2  **** 
1  B  3  **** 
2  C  1  **** 
2  C  2  **** 
2  A  3  **** 
2  B  4  **** 

Для каждого Log_ID, есть несколько значений в user_id и линии. (Log_ID, Line) всегда будет уникальным, но (Log_ID, User_ID) не будет.

Я пытаюсь вернуть уникальные пары (Log_ID, User_ID), где самым низким значением линии является тай-брейк. Результирующий набор будет выглядеть так:

Log_ID User_ID Line Attribute 
1  A  1  **** 
1  B  2  **** 
2  C  1  **** 
2  A  3  **** 
2  B  4  **** 

Ничего из того, что я пробовал, сработало. Я сохраняю либо уникальные (Log_ID, User_ID, Line) триплиты, либо получаю только строки, где Line = 1.

мне нужны дополнительные атрибуты из таблицы, кроме Log_ID, user_id, и линии, поэтому я не могу просто использовать SELECT DISTINCT

Есть идеи? Решения, которые я нашел, обычно предполагают, что я пытаюсь присоединиться к к таблице и что я хочу присоединиться к наименьшему совпадению. Но это моя основная таблица.

Спасибо!

ответ

2

Этот тип определения приоритетов может эффективно использовать row_number().

select t.* 
from (select t.*, 
      row_number() over (partition by log_id, user_id 
           order by line) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

EDIT:

Вы можете также сделать это путем присоединения на низшем матче или с использованием связанного подзапроса. Например:

select t.* 
from t 
where t.line = (select min(t2.line) 
       from t t2 
       where t2.log_id = t.log_id and t2.user_id = t.user_id 
       ); 

row_number() обычно быстрее.

+0

Вступление в низшее совпадение работало как шарм и намного быстрее, чем row_number(). Спасибо! – Avyncentia

+0

@Avyncentia. , , Интересная точка данных. 'row_number()' часто бывает быстрее, но не всегда. –

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