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
相关产品推荐
相关产品推荐

