2015-08-24 22 views
0

表:SQL在第一次找到的項目,優先返回不同的記錄

id | tag | pk 
----+-----+---- 
    1 | 111 | 1 
    2 | 111 | 2 
    2 | 112 | 3 
    3 | 111 | 4 
    4 | 333 | 5 
    4 | 334 | 6 
    4 | 111 | 7 
    5 | 335 | 8 
... for 1,000,000 rows 

所需的輸出

id | tag | pk 
----+-----+---- 
    1 | 111 | 1 
    2 | 111 | 2 
    3 | 111 | 4 
    4 | 111 | 7 
    5 | 335 | 8 
... for limit of 500 rows 

我想返回不同的ID,但我想先回行,其中標籤= 111作爲獨特的;否則,第一個發現會做。我也想限制輸出爲500行。

我看着工會,相交...但是,無法產生所需的結果。

+0

會不會有永遠只能是一個111的任何一個ID,或能有倍數,例如:(ID,標籤, pk) (1,111,1) (1,111,2) – user3476534

回答

1

ORDER BY子句中使用CASE聲明:

SELECT * FROM t; 
┌────┬─────┬────┐ 
│ id │ tag │ pk │ 
├────┼─────┼────┤ 
│ 1 │ 111 │ 1 │ 
│ 2 │ 111 │ 2 │ 
│ 2 │ 112 │ 3 │ 
│ 3 │ 111 │ 4 │ 
│ 4 │ 333 │ 5 │ 
│ 4 │ 334 │ 6 │ 
│ 4 │ 111 │ 7 │ 
│ 5 │ 335 │ 8 │ 
└────┴─────┴────┘ 
(8 rows) 

SELECT DISTINCT ON (id) * 
FROM t 
ORDER BY id, (CASE tag WHEN 111 THEN 0 ELSE 1 END); 
┌────┬─────┬────┐ 
│ id │ tag │ pk │ 
├────┼─────┼────┤ 
│ 1 │ 111 │ 1 │ 
│ 2 │ 111 │ 2 │ 
│ 3 │ 111 │ 4 │ 
│ 4 │ 111 │ 7 │ 
│ 5 │ 335 │ 8 │ 
└────┴─────┴────┘ 
(5 rows) 
+0

感謝您的回答。 – brianray

相關問題