Mysql 分组聚合实现 over partition by 功能
来源:互联网 发布:知乎如何发问题 编辑:程序博客网 时间:2024/05/22 08:00
mysql中没有类似oracle和postgreSQL的 OVER(PARTITION BY)功能. 那么如何在MYSQL中搞定分组聚合的查询呢
先说结论: 利用 group_concat + substr等函数处理
例如: 订单表一张, 只保留关键字段
iduser_idmoneycreate_time11501420520000211001420520010321001420520020422001420520030业务: 查找每个用户的最近一笔消费金额
单纯使用group by user_id, 只能按user_id 将money进行聚合, 是无法将最近一单的金额筛选出来的, 只能满足这些需求, 例如: 每个用户的总消费金额 sum(money), 最大消费金额 max(money), 消费次数count(1) 等
但是我们有一个group_concat可以用, 思路如下:
1. 查找出符合条件的记录, 按user_id asc, create_time desc 排序;
select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time descuser_idmoneycreate_time1100142052001015014205200002200142052003021001420520020
2. 将(1)中记录按user_id分组, group_concat(money);
select t.user_id, group_concat( t.money ) moneys from (select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc) t group by user_iduser_idmoneys1100,502200,100
3. 这时, 如果用户有多个消费记录, 就会按照时间顺序排列好, 再利用 subString_index 函数进行切分即可
完整SQL:
select t.user_id, substring_index(group_concat( t.money ),',',1) lastest_money from (select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc) t group by user_id ;user_idmoneys11002200
利用这个方案, 以下类似业务需求都可以这么做, 如:
1. 查找每个用户过去10个的登陆IP
2. 查找每个班级中总分最高的两个人
0 0
- Mysql 分组聚合实现 over partition by 功能
- Mysql 分组聚合实现 over partition by 功能
- Mysql 分组聚合实现 over partition by 功能
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能.
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
- mysql 实现row_number() over(partition by ) 分组排序功能
- MySql ..IF.. 实现row_number() over(partition by ) 分组排序功能
- MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能优化
- mysql模拟Oracle(select t.*, row_number() over(partition by...)...实现分组排序功能
- mysql: 实现row_number() over (partition by) 分组排序
- MySQL实现ORALCE的row_number()over(partition by xx)功能
- Mysql实现ROW_NUMBER() over(PARTITION BY column1 order by column2)
- mysql实现ROW_NUMBER() over (PARTITION BY xx ORDER BY ** DESC)
- sql实现oracle分析函数功能 over partition by
- mySql 实现排序函数row_number() over(partition by )
- MySQL实现Oracle的row_number()over(partition by)
- row_number() over(partition by '分组' order by '日期')
- Scala学习笔记14【包、类、对象、成员、伴生类、伴生对象访问权限】
- html基础-标题
- QT 自定义Qcombobox样式,下拉项同时包括图片和文字
- ALAssetsLibrary的使用问题:获取到ALAsset的thumbnail或者其他属性保存数组,在别地地方为nil的问题处理
- 使用Powermock和mockito来进行单元测试
- Mysql 分组聚合实现 over partition by 功能
- 指针小记
- 如何在圆形 imageView android 上添加一个阴影和边界?
- jstl核心标签库使用
- 关于wifi的工具类
- 七牛---设置notifyURL没有收到回调
- Java微信开发-服务器配置等信息-
- SQL注入——如何防御(三)
- C++primer学习:关联容器(2)