MySQL分组排序后取每组的TopN

记录一下

现实开发中,经常遇到需要根据某个字段分组、字段排序后取最早的N条数据,传统的Sql无法满足此项要求(分组后只保留一条数据)。MySQL8之后出现了窗口函数很好的满足了我们的需求。

SELECT * FROM ( SELECT *, ROW_NUMBER () OVER ( PARTITION BY [分组字段] ORDER BY [排序字段] ) rownum FROM 表名 ) t  WHERE rownum = N

业务要求:查询出峰值日活用户数(根据租户、天分组 取数量最高的那条记录)

CREATE TABLE `login_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `login_time` datetime NOT NULL COMMENT '登录时间',
  `user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT= 12380 DEFAULT CHARSET=utf8 COMMENT='登录日志表';
SELECT	t1.tenant_id, t1.daytime, t1.count FROM ( SELECT ROW_NUMBER ( ) over ( PARTITION BY testTable.tenant_id ORDER BY testTable.count DESC ) AS RowNum, testTable.*  FROM (SELECT tmp.tenant_id,  tmp.dayTime AS dayTime, count( * ) AS 'count' FROM(SELECT  tenant_id,DATE_FORMAT( login_time, '%Y-%m-%d' ) AS dayTime, user_id  FROM login_log WHERE tenant_id IS NOT NULL GROUP BY tenant_id,  DATE_FORMAT( login_time, '%Y-%m-%d' ), user_id  ) tmp GROUP BY tmp.tenant_id,  tmp.dayTime  ORDER BY  tmp.tenant_id ASC, count DESC  ) AS testTable ) AS t1  WHERE RowNum = 1

查询结果
可以看到查询后的结果就是我们想要的数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值