PostgreSQL中计算percent_rank()后对结果二次过滤的查询实现方法
实现方案
核心原因是SQL的执行顺序限制:同层级查询中,WHERE子句执行优先级高于窗口函数计算,因此无法直接在当前查询的WHERE条件中过滤窗口函数的输出结果。你可以通过两种方式实现需求,均为先完成前置行过滤、计算百分位排名,再对排名结果做二次过滤:
方案1:使用公共表表达式(CTE,可读性更强)
WITH ranked_users AS ( SELECT name, points, PERCENT_RANK() OVER (ORDER BY points) AS percent_rank FROM users WHERE username IS NOT NULL AND is_active = TRUE ) SELECT name, points, percent_rank FROM ranked_users WHERE percent_rank > 0.1;
方案2:使用嵌套子查询
SELECT name, points, percent_rank FROM ( SELECT name, points, PERCENT_RANK() OVER (ORDER BY points) AS percent_rank FROM users WHERE username IS NOT NULL AND is_active = TRUE ) AS user_rank_result WHERE percent_rank > 0.1;
两种写法的执行效率完全一致,你可以根据自己的编码习惯选择。
内容的提问来源于stack exchange,提问作者Mark Reddington
相关产品推荐
相关产品推荐

