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

MySQL如何查询每日销量排名前N的商品?

MySQL查询每日销量TopN商品实现方案

你的需求是按日期分组取每组销量前N的商品,最终结果按日期降序、同日期销量降序排列,以下分不同MySQL版本给出实现代码:

方案1:MySQL 8.0+ 版本(推荐,支持窗口函数)

直接使用ROW_NUMBER()窗口函数实现组内排序编号:

-- 此处N替换为你需要的排名阈值,比如示例中的N=2就写rk <=2
SELECT `date`, item, quantity
FROM (
    SELECT 
        `date`, 
        item, 
        quantity,
        -- 按日期分组,组内按销量降序排序编号
        ROW_NUMBER() OVER (PARTITION BY `date` ORDER BY quantity DESC) AS rk
    FROM daily_sales -- 此处替换为你自己的表名
) t
WHERE rk <= 2 -- 替换为你需要的N值
ORDER BY `date` DESC, quantity DESC;

*如果需要保留销量并列的商品,可以把ROW_NUMBER()替换为RANK()或DENSE_RANK():

  • RANK():相同销量排名相同,后续排名跳空(比如两个第2名,下一个就是第4名)
  • DENSE_RANK():相同销量排名相同,后续排名连续(比如两个第2名,下一个是第3名)

方案2:MySQL 5.x 版本(不支持窗口函数)

可以通过用户变量实现组内排序编号:

SELECT `date`, item, quantity
FROM (
    SELECT 
        *,
        -- 变量判断是否是同一日期,是则序号+1,否则重置为1
        @rk := IF(@current_date = `date`, @rk + 1, 1) AS rk,
        @current_date := `date`
    FROM (
        -- 先按日期降序、同日期销量降序排序
        SELECT `date`, item, quantity
        FROM daily_sales -- 替换为自己的表名
        ORDER BY `date` DESC, quantity DESC
    ) sorted,
    -- 初始化变量
    (SELECT @rk := 0, @current_date := '') init_vars
) t
WHERE rk <= 2 -- 替换为你需要的N值
ORDER BY `date` DESC, quantity DESC;

内容的提问来源于stack exchange,提问作者sqlnewbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:24:02