MYSQL怎么查询X表中销量排名第X的数据?

MYSQL查询X表中销量排名第X的数据

这里我们举个例子:查询订单明细表(order _detail)中销量(下单件数)排名第二的商品id,如果不存在返回null,如果存在多个排名第二的商品则需要全部返回。

案例表结构【1_order _detail】
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for 1_order_detail
-- ----------------------------
DROP TABLE IF EXISTS `1_order_detail`;
CREATE TABLE `1_order_detail` (
  `order_detail_id` int(11) DEFAULT NULL,
  `sku_num` int(11) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `sku_id` int(11) DEFAULT NULL,
  `create_date` varchar(255) DEFAULT NULL,
  `order_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;
实现思路

首先根据商品id汇总得到每个商品的总销量,然后再通过窗口函数根据商品总销量去排序,这里选择的窗口函数是DENSE_RANK【这里考虑到了销量一样的也要查出来,其他还有RANK,ROW_NUMBER,根据自己的业务场景来选择】然后再根据排序的值去筛选就好了。

  • RANK() 排序相同时会重复,总数不变,即会出现1、1、3这样的排序结果;
  • DENSE_RANK() 排序相同时会重复,总数会减少,即会出现1、1、2这样的排序结果;
  • ROW_NUMBER() 排序相同时不会重复,会根据顺序排序。
SELECT sku_id 
FROM (
  SELECT sku_id, DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_rank
  FROM (
    SELECT sku_id, SUM(sku_num) AS sales
    FROM 1_order_detail
    GROUP BY sku_id
  ) AS t1
) AS t2
WHERE sales_rank = 2;

这里需要注意的点:窗口函数只有MYSQL8.0以上才能用!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值