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

Posted

技术标签:

【中文标题】在单个 SELECT 中获取某个组的第一项【英文标题】:Get the first item of some group in a single SELECT 【发布时间】:2021-11-11 00:25:14 【问题描述】:

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

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

这太可怕了,似乎有很多额外的东西不需要 - 一个子选择,一个子选择的别名,另一个选择语句 - 充其量你最终会在输出中得到一个额外的列 -在最坏的情况下,您必须重新列出一堆列。 ????

显然,我想要做的由于操作的顺序而不是有效的 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

但我一直认为有一种方法可以实现它并浪费大量时间尝试。

那么,问题,是否有可能在不使用子选择的情况下实现它

基本上,我只希望每个项目中的一个与单个条件匹配,例如,每个月每个订单的第一个项目、每个集合中最大的项目、每个不同案例的单个测试示例等。

【问题讨论】:

【参考方案1】:

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.

【讨论】:

哇,它奏效了——我的生活得到了改善。 就是这样! :)

以上是关于在单个 SELECT 中获取某个组的第一项的主要内容,如果未能解决你的问题,请参考以下文章

在Scala中为列表中的每一行获取元组的第一项

怎么用sql语句获取每一组的第一条记录(包括所有字段,不是单个字段)

MySQL获取group后所有组的第一条数据

在 Swift 中获取列表的第一项 [关闭]

检索子文档中数组的第一项而不获取其他子文档

Postgresql 选择最后一组的第一项