【发布时间】: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