如何在PostgreSQL嵌套查询中选取最大值并与其他值做差
实现方法分享
这问题我之前处理类似需求时碰到过,用你提到的嵌套查询配合聚合函数就能轻松搞定,给你两种实用的实现方式:
方法一:标量子查询获取全局最大值
这种方法兼容性最好,几乎所有关系型数据库都支持,完全符合你要求的嵌套查询写法:
SELECT foo.ages, (SELECT MAX(ages) FROM people) - foo.ages AS age_difference FROM (SELECT ages FROM people ORDER BY ages DESC) foo;
逻辑说明:
- 内层的
(SELECT ages FROM people ORDER BY ages DESC) foo就是你想要的按年龄降序排列的结果集,我们给它起个别名foo方便后续引用; - 标量子查询
(SELECT MAX(ages) FROM people)会直接取出people表中年龄的最大值; - 最后用这个最大值减去每个行的
ages,得到的age_difference就是你要的差值(包括最大值自身的差值0)。
方法二:窗口函数简化写法(适合支持窗口函数的数据库)
如果你的数据库是MySQL 8.0+、PostgreSQL、SQL Server这类支持窗口函数的,用下面的写法会更简洁,同样基于你要求的嵌套查询:
SELECT ages, MAX(ages) OVER () - ages AS age_difference FROM (SELECT ages FROM people ORDER BY ages DESC) foo;
逻辑说明:
MAX(ages) OVER ()是窗口函数的用法,它会基于整个结果集计算最大年龄,不用单独再写一个子查询;- 后续的减法逻辑和方法一一致,最终输出的结果和你预期的完全匹配。
小提醒
这里的嵌套查询里的ORDER BY ages DESC主要是控制最终结果的输出顺序,如果你不需要特定顺序,去掉也不影响差值的计算哦~
内容的提问来源于stack exchange,提问作者Clint_A
相关产品推荐
相关产品推荐

