2012-02-03 63 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