Sql 在组查询中选择第一个

Sql 在组查询中选择第一个,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,如果之前已经回答过,请道歉 假设我有下表: colA | colB | colC -----|------|----- a | 1 | 9 a | 2 | 8 b | 1 | 4 b | 2 | 3 b | 1 | 3 c | 5 | 1 c | 4 | 2 我想从每组中选择第一行(a列,按b列排序时,c asc) 构造查询以获得这些结果的最整洁的方法是什么 (Postgresql 9) 谢谢,p.您可以使用和

如果之前已经回答过,请道歉

假设我有下表:

colA | colB | colC
-----|------|-----
a    | 1    | 9
a    | 2    | 8
b    | 1    | 4
b    | 2    | 3
b    | 1    | 3
c    | 5    | 1
c    | 4    | 2
我想从每组中选择第一行(a列,按b列排序时,c asc)

构造查询以获得这些结果的最整洁的方法是什么

(Postgresql 9)

谢谢,p.

您可以使用和派生表:

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工具箱中。

您可以使用和派生表:

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工具箱中。

我以前也遇到过与您相同的问题。我使用窗口函数和派生表来解决问题。

我以前也遇到过与您相同的问题。我使用窗口函数和派生表来解决问题。

除了“mu太短”之外我发现我可以使用更简单的“distinct on”功能来实现这些功能:

除了“mu太短”的答案使用窗口功能(一所大学也让我感兴趣)之外,我发现我可以使用更简单的“distinct on”功能实现功能:


谢谢你的回答,但我认为我的解决方案“更整洁”,所以除非你能说服我,否则我会给自己打勾(一两天内)。如果你不同意,我会感谢你的辩论!(顺便说一句,我还是对你的答案投了更高的票…)我勾选你的答案是因为你是对的,这是更“标准”的方法,但在我的情况下,我将使用我的解决方案。谢谢你的回答,但我认为我的解决方案“更整洁”,所以除非你能说服我,否则我会给自己打勾(一两天内)。如果你不同意,我会感谢你的辩论!(顺便说一句,我还是对你的答案投了更高的票…)我勾选你的答案是因为你是对的,这是更“标准”的方法,但在我的情况下,我将使用我的解决方案。谢谢。在这种情况下,这是一种合理的方法。我想到的唯一缺点是它是非标准的,我倾向于使用基于标准的解决方案进行未来的校对。在这种情况下,这是一种合理的方法。我想到的唯一缺点是它是非标准的,我倾向于使用基于标准的解决方案进行未来的校对。
select distinct on (colA) * from tbl order by colA, colB, colC;