mysql对某个字段分组侯取topN的sql写法
来源:互联网 发布:生态环境监测大数据 编辑:程序博客网 时间:2024/05/16 03:16
Table1
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
| 1 |AAAA | C1 | 67 |
| 2 |BBBB | C1 | 55 |
| 3 |CCCC | C1 | 67 |
| 4 |DDDD | C1 | 65 |
| 5 |EEEE | C1 | 95 |
| 6 |FFFF | C2 | 57 |
| 7 |GGGG | C2 | 87 |
| 8 |HHHH | C2 | 74 |
| 9 |IIII | C2 | 52 |
| 10 |JJJJ | C2 | 81 |
| 11 |KKKK | C2 | 67 |
| 12 |LLLL | C2 | 66 |
| 13 |MMMM | C2 | 63 |
| 14 |NNNN | C3 | 99 |
| 15 |OOOO | C3 | 50 |
| 16 |PPPP | C3 | 59 |
| 17 |QQQQ | C3 | 66 |
| 18 |RRRR | C3 | 76 |
| 19 |SSSS | C3 | 50 |
| 20 |TTTT | C3 | 50 |
| 21 |UUUU | C3 | 64 |
| 22 |VVVV | C3 | 74 |
+----+------+------+-----+
结果如下
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
| 5 |EEEE | C1 | 95 |
| 1 |AAAA | C1 | 67 |
| 3 |CCCC | C1 | 67 |
| 7 |GGGG | C2 | 87 |
| 10 |JJJJ | C2 | 81 |
| 14 |NNNN | C3 | 99 |
| 18 |RRRR | C3 | 76 |
+----+------+------+-----+
方法一:
select a.id,a.SName,a.ClsNo,a.Score
from Table1 a leftjoin Table1 b on a.ClsNo=b.ClsNoand a.Score<b.Score
group by a.id,a.SName,a.ClsNo,a.Score
having count(b.id)<2
order by a.ClsNo,a.Scoredesc
方法二:
select *
from Table1 a
where 2>(selectcount(*) from Table1where ClsNo=a.ClsNo and Score>a.Score)
order by a.ClsNo,a.Scoredesc
方法三:
select *
from Table1 a
where id in (select idfrom Table1 where ClsNo=a.ClsNoorder by Scoredesc limit 2)
order by a.ClsNo,a.Scoredesc
方法....
这里列出了多种SQL语句的实现方法,有些是MySQL特有的(Limit, 其它数据库可根据实际更改,比如Oracle的rownum,MS SQL SERVER 的 top,..),有时是SQL标准支持的。但效率上和应用的场合或许不同。具体应用时可根据实际表中的记录情况,索引情况进行选择。
特例 N=1 ,即取最大的/最小的一条记录。
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
| 5 |EEEE | C1 | 95 |
| 7 |GGGG | C2 | 87 |
| 14 |NNNN | C3 | 99 |
+----+------+------+-----+
select *
from Table1 a
where not exists (select 1 from Table1 where ClsNo=a.ClsNo and Score>a.Score);
select a.*
from Table1 a inner join (select ClsNo, max(Score) as mScore from Table1 group by ClsNo) b
on a.ClsNo=b.ClsNo and a.Score=b.Score
select *
from (select * from Table1 order by Score desc) t
group by ClsNo
- mysql对某个字段分组侯取topN的sql写法
- MySQL分组然后取每个分组中按照某些字段排序的topN条数据
- mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
- mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
- mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
- mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
- mysql sql 笔记-获取分组中某个字段的最大的行
- mysql 分组topN
- 取某个表某个字段的内容的sql函数
- sql取某个字段相近某个值的记录
- 使用函数分组对某个字段进行字符串的累加
- 数据按某个字段分组,且取每个分组的最大值
- sql 按字段分组后取日期最新的一条
- SQL根据某个字段分组查询:
- MySQL数据库随机取某个字段的值
- 使用RDD解决spark TopN问题:分组、排序、取TopN
- Spark核心编程-分组取topN
- spark中实现分组取topN
- 学习笔记第五周——嵌套if语句之排位大小
- java对象拷贝——PropertyUtils.copyProperties()用法和性能
- Mockito一个用于Java开发的伟大的模拟框架
- Android 蓝牙
- Mybatis简介与原理
- mysql对某个字段分组侯取topN的sql写法
- rsync命令
- jsp和 html 区别
- mac 配置jdk1.8(小白教程)
- RecyclerView被嵌套之后无法实现快速滚动
- 关于线程的一个小的游戏
- python读取mat数据后转格式提示“KeyError: 0”
- 前端杂记_持续更新
- Android 自定义smartImageView