PostgreSQL中查询表内前3个最大数量(含并列)的问题排查
正确实现方案分析
你的原SQL语句问题出在排序逻辑和取数逻辑不匹配:你按name、quantity DESC排序后取前3行(含并列),这里的“前3行”是指排序后的前3条记录,而非前3个最大的quantity数值对应的所有行,所以只会返回两个500和一个400,不符合预期。
下面是两种正确的实现方式:
方法一:使用窗口函数DENSE_RANK()
利用DENSE_RANK()对quantity降序排名,相同数值会获得相同排名且排名连续,直接筛选排名≤3的行即可:
SELECT name, quantity FROM ( SELECT name, quantity, DENSE_RANK() OVER (ORDER BY quantity DESC) AS rnk FROM employee ) t WHERE rnk <= 3 ORDER BY quantity DESC, name;
这个方法逻辑直观,能准确匹配需求,是这类场景的常用方案。
方法二:先获取前3大的distinct quantity值再关联
先提取出前3个最大的不重复quantity值,再关联原表筛选对应行:
SELECT e.name, e.quantity FROM employee e JOIN ( SELECT DISTINCT quantity FROM employee ORDER BY quantity DESC FETCH FIRST 3 ROWS WITH TIES ) q ON e.quantity = q.quantity ORDER BY e.quantity DESC, e.name;
这种方式先锁定目标数值范围,再匹配原数据,逻辑同样清晰。
内容的提问来源于stack exchange,提问作者gautam
相关产品推荐
相关产品推荐

