【问题标题】:Get the first item of some group in a single SELECT在单个 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

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

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

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

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

    DISTINCT ON 的教科书示例!

    SELECT DISTINCT ON (something) columns FROM whatever;
    

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

    请参阅(包含大量详细信息):

    And it's faster, too.

    【讨论】:

    • 哇,它奏效了——我的生活得到了改善。
    • 就是这样! :)
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多