求助: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
相关产品推荐
相关产品推荐

