在单个 SELECT 中获取某个组的第一项

Get the first item of some group in a single SELECT

我每天都做这样的事情 - 这将是我最常见的查询之一:

select * from 
   (select columns, rownumber() over (partition by something) as number from whatever) x
where x = 1

这太可怕了,似乎有很多不需要的额外东西 - subselect,sub select 的别名,另一个 select 语句- 最好的情况是你最终会在输出中多出一列 - 最坏的情况是你必须重新列出一堆列。

显然,我想做的 是无效的SQL,因为操作顺序:

select * from whatever where rownumber() over (partition by something) = 1

虽然这个看起来可行,但它实际上给出了一个非常错误的答案:

select * from whatever,
    lateral (select rownumber() over (partition by something) as number)
where number = 1

first_value() 看起来它应该让你到达那里 - 但你仍然有很多行:

select first_value(key) over (partition by something), columns from whatever

但我一直认为有一种方法可以实现它并且浪费了很多时间来尝试。

所以,问题,是否可以不使用子select来实现

本质上,我只想要符合单个条件的每个项目中的一个,例如,每个月每个订单的第一个项目,每个集合中最大的项目,这些不同案例中的每一个的单个测试示例等。

DISTINCT ON!

的教科书示例
SELECT DISTINCT ON (something) columns FROM whatever;

如果没有 ORDER BY,您可以从具有相同 something 的每组中任意选择一个。添加 ORDER BY something, something_else 来决定选择哪一行。

参见(详细信息):

  • Select first row in each GROUP BY group?

And it's faster, too.