PostgreSQL如何从多表连接查询结果中提取计算列值最大的行
方案1:通过子查询/CTE嵌套匹配最大值
你可以直接把原查询作为CTE(公用表表达式)封装后,匹配最大值即可,逻辑和你熟悉的单表取最大值行完全一致,只是把物理表替换为自定义的查询结果集:
WITH original_query AS ( SELECT z.xyz, (x.aa - x.bb) * y.qq as that_column FROM table_1 x JOIN table_2 y ON x.foo = y.foo JOIN table_3 z ON y.bar = z.bar JOIN table_4 w ON w.baz = z.baz WHERE x.aa IS NOT NULL ) SELECT xyz FROM original_query WHERE that_column = (SELECT MAX(that_column) FROM original_query);
该写法可读性高,PostgreSQL查询优化器可以很好地处理该逻辑,不会产生额外性能损耗。
方案2:使用窗口函数实现
你也可以用RANK()排名函数实现,扩展灵活性更高:
SELECT xyz FROM ( SELECT z.xyz, (x.aa - x.bb) * y.qq as that_column, RANK() OVER (ORDER BY that_column DESC) as rnk FROM table_1 x JOIN table_2 y ON x.foo = y.foo JOIN table_3 z ON y.bar = z.bar JOIN table_4 w ON w.baz = z.baz WHERE x.aa IS NOT NULL ) t WHERE rnk = 1;
如果后续需要取排名前N的行,只需要修改条件为rnk <= N即可,不需要调整其他逻辑。
内容的提问来源于stack exchange,提问作者uvero
相关产品推荐
相关产品推荐

