You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:03