SQL如何实现按天查询包含并列情况的金额Top3记录
实现方案
支持窗口函数的主流数据库(MySQL 8.0+、PostgreSQL、Oracle等)
用DENSE_RANK窗口函数是最适配需求的方案,它的特性是相同数值排名一致、不会跳过后续排名序号,刚好满足“并列在前3范围全部返回”的规则,代码如下:
WITH daily_rank AS ( SELECT Day, Name, Amount, DENSE_RANK() OVER (PARTITION BY Day ORDER BY Amount DESC) AS rk FROM 你的表名 ) SELECT Day, Name, Amount FROM daily_rank WHERE rk <= 3 ORDER BY Day, Amount DESC;
逻辑说明:
PARTITION BY Day按天分组独立计算排名ORDER BY Amount DESC单天内按金额从高到低排序- 用
DENSE_RANK处理并列场景:比如周二Maya和John的金额都是150,排名均为1,Sern的120排名为2,Rico的110排名为3,四条都符合rk<=3的筛选条件,和预期输出完全匹配 - 如果单日记录不足3条,会自动全部返回
不支持窗口函数的老版本MySQL(5.x及以下)实现
可以用关联子查询实现相同逻辑:
SELECT t1.Day, t1.Name, t1.Amount FROM 你的表名 t1 WHERE ( SELECT COUNT(DISTINCT t2.Amount) FROM 你的表名 t2 WHERE t2.Day = t1.Day AND t2.Amount > t1.Amount ) < 3 ORDER BY t1.Day, t1.Amount DESC;
逻辑说明:子查询统计当前记录同天内比它金额高的不同金额数量,如果这个数量小于3,说明当前记录属于前3高的范围,符合筛选条件。
内容的提问来源于stack exchange,提问作者Gops61
相关产品推荐
相关产品推荐

