2012-02-03 32 views
0

如果此前已回答過,請道歉。先在組查詢中選擇

說我有下表:

colA | colB | colC 
-----|------|----- 
a | 1 | 9 
a | 2 | 8 
b | 1 | 4 
b | 2 | 3 
b | 1 | 3 
c | 5 | 1 
c | 4 | 2 

和我想從每個組選擇第一行(列的,當由列B,C遞增排序)

colA | colB | colC 
-----|------|----- 
a | 1 | 9 
b | 1 | 3 
c | 4 | 2 

什麼是最簡單的方式來構建查詢來獲得這些結果?

(PostgreSQL的9)

感謝,P.

回答

1

你可以使用一個window function和派生表:

select cola, colb, colc 
from (
    select cola, colb, colc, 
      rank() over (partition by cola order by colb, colc asc) as r 
    from your_table 
) as dt 
where r = 1 

窗口功能是非常方便的,應該是在大家的SQL工具包。

+0

謝謝你的回答,但我認爲我的解決方案是「更整潔」,除非你能說服我,否則我會給自己打勾(在一天或兩天內)。如果你不同意,我將很感激辯論! (ps我upvoted你的答案都一樣...) – pstanton 2012-02-03 07:45:11

+0

我打勾你的,因爲你是對的,這是更'標準'的方法,但在我的情況下,我要使用我的解決方案。謝謝。 – pstanton 2012-02-05 23:19:16

0

我曾經有和你一樣的問題。我使用了窗口函數和派生表,然後解決了這個問題。

3

除了「畝產過短」的答案使用窗口函數(大專也使我對),我發現我可以用更簡單‘不同的’功能實現的功能:

select distinct on (colA) * from tbl order by colA, colB, colC; 
+0

[DISTINCT ON](http://www.postgresql.org/docs/current/interactive/queries-select-lists.html#QUERIES-DISTINCT)在這種情況下是合理的方法。想到的唯一缺點是它是非標準的,我傾向於選擇基於標準的解決方案以用於未來的打樣。 – 2012-02-03 08:10:17