2015-11-30 71 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和Line多個值。 (Log_ID,Line)將始終是唯一的,但(Log_ID,User_ID)不會。

我想返回最低的行值是tiebreaker的唯一(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; 

編輯:

可以還通過加盟的最低匹配或使用相關子查詢做到這一點。例如:

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()'通常更快,但並非總是如此。 –