PostgreSQL中如何获取分组后range类型列的外边界范围
解决PostgreSQL按分组求Range外边界的问题
你原来的查询失败是因为upper(value)和lower(value)没有经过聚合处理——分组后每个name对应多行value,数据库不知道该取哪一行的上下边界值。要实现需求,你需要用聚合函数提取组内所有range的最小左边界和最大右边界,再组合成外边界range,或者直接输出拆分后的边界列。
方法1:生成合并后的外边界Range列
使用min()取组内所有range的最小左边界,max()取最大右边界,再用对应类型的range构造函数(比如int4range,根据你的range实际类型调整)组合成新的range:
SELECT name, int4range( MIN(lower(value)), MAX(upper(value)) ) AS outer_range FROM parameters GROUP BY name;
如果你的range是其他数值类型(比如bigint对应int8range,numeric对应numrange),替换对应的range构造函数即可。
方法2:拆分输出上下边界列
如果不需要合并成range类型,直接输出拆分后的边界列:
SELECT name, MIN(lower(value)) AS lower_bound, MAX(upper(value)) AS upper_bound FROM parameters GROUP BY name;
验证结果
用你提供的示例数据测试,两种方法都会得到符合预期的结果:
- 方法1输出的
outer_range列会是[1,3]、[10,19]、[1,9] - 方法2会输出对应的上下边界数值列
内容的提问来源于stack exchange,提问作者Joachim
相关产品推荐
相关产品推荐

