You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:PostgreSQL窗口函数结合相等谓词用法的相关文档查询

PostgreSQL窗口函数与比较运算符结合用法的文档参考

你编写的以下PostgreSQL查询可以正确标记出每个grp分组中id最大的行:

with tbl1(id, grp, name) as (
values
(1, 1, 'name1'),
(2, 1, 'name2'),
(3, 2, 'name3'),
(4, 2, 'name4')
)SELECT 
    id = max(id) OVER (PARTITION BY grp) as is_max,
    id, grp, name
    from tbl1
    ;

查询结果:

is_max |id |grp|name |
-------+---+---+-----+
false  |1  |1  |name1|
true   |2  |1  |name2|
false  |3  |2  |name3|
true   |4  |2  |name4|

这种用法的本质是将窗口函数的计算结果作为标量表达式,与普通列进行比较运算,相关参考可以在PostgreSQL官方文档的以下部分找到:

  • 窗口函数调用的表达式属性:窗口函数调用本身属于合法的标量表达式,可用于任何允许标量表达式的场景(比如SELECT列表),这部分在官方文档的「窗口函数」章节的「窗口函数调用语法」部分有说明——窗口函数的结果是每行的一个计算值,和普通列的使用方式完全一致。
  • 通用表达式运算规则:比较运算符(如=)可以与任何合法标量表达式结合使用,窗口函数的返回值自然也符合要求,这部分在官方文档的「表达式」章节的「比较表达式」和「标量表达式」部分有覆盖,所有标量表达式的运算规则都适用于窗口函数的结果。

简单来说,你这里的写法是窗口函数的常规用法延伸:先通过max(id) OVER (PARTITION BY grp)计算出每个分组的最大id值,再将每行的id与该分组最大值做相等比较,最终得到布尔类型的标记列。

内容的提问来源于stack exchange,提问作者Stelios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:57:32