• 售前

  • 售后

热门帖子
入门百科

mysql获取分组后每组的最大值实例详解

[复制链接]
务川冷泉水鱼庄 显示全部楼层 发表于 2021-10-25 20:09:03 |阅读模式 打印 上一主题 下一主题
mysql获取分组后每组的最大值实例详解
1. 测试数据库表如下:
  1. create table test
  2. (
  3.   `id` int not null auto_increment,
  4.   `name` varchar(20) not null default '',
  5.   `score` int not null default 0,
  6.   primary key(`id`)
  7. )engine=InnoDB CHARSET=UTF8;
复制代码
2. 插入如下数据:
  1. mysql> select * from test;
  2. +----+----------+-------+
  3. | id | name   | score |
  4. +----+----------+-------+
  5. | 1 | jason  |   1 |
  6. | 2 | jason  |   2 |
  7. | 3 | jason  |   3 |
  8. | 4 | linjie  |   1 |
  9. | 5 | linjie  |   2 |
  10. | 6 | linjie  |   3 |
  11. | 7 | xiaodeng |   1 |
  12. | 8 | xiaodeng |   2 |
  13. | 9 | xiaodeng |   3 |
  14. | 10 | hust   |   2 |
  15. | 11 | hust   |   3 |
  16. | 12 | hust   |   1 |
  17. | 13 | haha   |   1 |
  18. | 14 | haha   |   2 |
  19. | 15 | dengzi  |   3 |
  20. | 16 | dengzi  |   4 |
  21. | 17 | dengzi  |   5 |
  22. | 18 | shazi  |   3 |
  23. | 19 | shazi  |   4 |
  24. | 20 | shazi  |   2 |
  25. +----+----------+-------+
复制代码
3. 下面是重点,目的是要按照name分组,然后分组后,获取每组中score分数最多的,sql如下
  1. select a.* from test a inner join (select name,max(score) score from test group by name)b on a.
  2. name=b.name and a.score=b.score order by a.name;
复制代码
固然,上面的最后的order by a.name可以去掉

4. 测试效果如下:
  1. +----+----------+-------+
  2. | id | name   | score |
  3. +----+----------+-------+
  4. | 3 | jason  |   3 |
  5. | 6 | linjie  |   3 |
  6. | 9 | xiaodeng |   3 |
  7. | 11 | hust   |   3 |
  8. | 14 | haha   |   2 |
  9. | 17 | dengzi  |   5 |
  10. | 19 | shazi  |   4 |
  11. +----+----------+-------+
复制代码
5. 网上许多方法都是错误的,比如如下一些,亲测是不行的
  1. select * from (select * from test order by score desc) t group by name order by score desc limit 4;
  2. select score,max(score) from test group by name;
  3. select * from test where score in (select max(score) from test group by name);
  4. select * from test where score in (select substring_index(group_concat(score order by score desc separator ','),',',1) from test group by name);
  5. select * from (select name,score,ROW_NUMBER() over(group by name order by score desc) as rowNum from test) rank where rank.rowNum <=1 order by rank.score desc;
  6. select * from( select StoresNo,[CustomerCaseNo],[PaymentsTime], ROW_NUMBER() over(partition by CustomerCaseNo order by [PaymentsTime] desc) as rowNum
  7. from BAL_paymentsSwiftInfo where StoresNo='zq00000034') ranked where ranked.rowNum <= 1 order by ranked.CustomerCaseNo, ranked.PaymentsTime desc
  8. select * from (select * from test order by score desc) as a group by a.name;
复制代码
感谢阅读,盼望能帮助到大家,谢谢大家对本站的支持!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作