在单个 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.
我每天都做这样的事情 - 这将是我最常见的查询之一:
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.