PostgreSQL中是否存在bool_or()聚合函数的等效窗口函数?
用窗口函数实现等效的
bool_or聚合结果 没问题,我来帮你解决这个需求!先快速回顾下你的场景:
你的原始数据查询:
select a,b from newtable;
返回结果:
a | b ---+--- a | f a | f a | f b | f b | f b | t (6 行记录)
你用聚合分组得到了符合预期的结果:
select a, bool_or(b) from newtable group by a;
结果:
a | bool_or ---+--------- a | f b | t
你想找等效的窗口函数实现,其实PostgreSQL的聚合函数是可以作为窗口函数使用的,只是直接用窗口函数会返回每一行对应的分组结果,所以我们需要加个小处理来得到你要的唯一分组行,这里有两种靠谱的方法:
方法1:直接用bool_or作为窗口函数 + DISTINCT
PostgreSQL支持把聚合函数放到窗口的OVER()子句里,指定按a分区(对应原来的group by a),然后用DISTINCT去重,就能得到和聚合分组完全一致的结果:
SELECT DISTINCT a, bool_or(b) OVER (PARTITION BY a) AS bool_or FROM newtable;
方法2:用MAX()替代bool_or(布尔值等价逻辑)
因为布尔类型里true是大于false的,所以MAX(b)的效果和bool_or(b)完全一样——只要分区里有一个true,结果就是true,全是false就返回false。同样结合窗口函数和DISTINCT:
SELECT DISTINCT a, MAX(b) OVER (PARTITION BY a) AS bool_or FROM newtable;
这两种方法都能输出你期望的两行结果,格式和聚合分组的结果完全匹配。
内容的提问来源于stack exchange,提问作者RubenLaguna
相关产品推荐
相关产品推荐

