在单个 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 中获取某个组的第一项的主要内容,如果未能解决你的问题,请参考以下文章