mysql分组后组内排名_SQL实现groupby分组后组内排序在⼀个⽉⿊风⾼的夜晚,⾃⼰⽆聊学习的SQL的时候,练习,突发奇想的想实现⼀个功能查询,⼀张成绩表有如下字段,班级ID,英语成绩,数据成绩,语⽂成绩如下图
实现 查询出 每个班级英语成绩最⾼的前两名的记录。
看起来不难的业务,做起来才知道还挺⿇烦的,说⽩了其实就是实现分组后的组内排序,⼀般不思考的话我们会写出这样的语句:
select top 2 English,Classid from CJ group by Classid order by English desc
出现这个错误,应该就明⽩了其实数据库的查询顺序是先分组的,最后才将结果进⾏排序。通过正常逻
辑思考,通过班级分组,不就是分了三个组:班级1,班级2,班级3 。我们可以通过聚合函数查询出,每个组的个数,平均值等。可是你后⾯跟了英语成绩什么⿁?分组之后意味着,我们不能查询单个的记录了,我们查询的单位都是关于组的信息。
第⼀种实现 1
SELECT * FROM CJ m
where(
select COUNT(*) from CJ n
where m.Classid = n.Classid and n.English > m.English)<2
order by Classid, English desc
也是当⽹上查的,可以这样理解,要出前两名的成绩,只要符合⽐你成绩⾼的不超过2个⼈就⾏了。其实是⼀个表的⾃连接,where条件就是⼀条⼀条记录对⽐,⾸先在m表中拿⼀条记录,是否符合 在同⼀班级中 ⽐你成绩⾼的不超过2个⼈。这样就可以到每个班的前两名成绩。然后按照降序排列。
在这种实现中,也可以加上其他筛选条件 ⽐如查询每个班级⼥⽣中英语成绩前两名的记录
SELECT * FROM (select * from CJ where Gender='⼥') m
where(
select COUNT(*) from (select * from CJ where Gender='⼥') n
where m.Classid = n.Classid and n.English > m.English)<2
order by Classid, English desc
SELECT * FROM CJ m
where(
select COUNT(*) from CJ n
where m.Classid = n.Classid and n.English > m.English and n.Gender='⼥')<2 --指的是内表
and Gender='⼥' --指的是外表
order by Classid, English desc
第⼆种是实现
select a.Classid,a.English from
(select Classid,English,row_number() over(partition by Classid order by English desc) as n
from CJ) a
where n<=2
最官⽅,最好的实现⽅式
简单的说row_number()从1开始,为每⼀条分组记录返回⼀个数字
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表⽰根据COL1分组,在分组内部根据 COL2排序,⽽此函数计算的值就表⽰每组内部排序后的顺序编号(组内连续的唯⼀的)
同样的加上条件
select a.Classid,a.English,n,test from
(select Classid,English,row_number() over(partition by Classid order by English desc) as n,123 test
from CJ where CJ.Gender='⼥') a
where n<=2
可以看出先执⾏的是where 进⾏筛选后,再通过分组,组内再排序,排序后在添加编号,其实是和正常的执⾏顺序⼀样的,只不过位置变了
SQL,group by分组后分别计算组内不同值的数量
select name as 姓名,sum( case when cargo='笔' then 1 else 0 end ) as 笔,sum( case when cargo='橡⽪' then 1 ...
sql ⽤Group by分组后&comma;取每组的前⼏条记录
Sql⽰例说明如何分组后求中间值--【叶⼦】
原⽂:Sql⽰例说明如何分组后求中间值--[叶⼦] 这⾥所谓的分组后求中间值是个什么概念呢? 我举个例⼦来说明⼀下: 假设我们现在有下⾯这样⼀个表: type name price -- ...
MySQL 排名、分组后组内排名、取各组的前⼏名 及排名后更新插⼊数据表中
⼀.排名 /*普通排名:从1开始,顺序往下排*/ AS rank ) r ORDER BY score; /*并列排名:相同的值是相同的排名*/ SELECT cs.* , CASE WHEN @p= ...groupby分组
group by 分组后 返回的是⼀个同属性的集合
group by 分组后 返回的是⼀个同属性的集合 我们可以遍历该集合
MySQL 排名、分组后组内排名、取各组的前⼏名
⼀.排名 /*普通排名:从1开始,顺序往下排*/ AS rank ) r ORDER BY score; /*并列排名:相同的值是相同的排名*/ SELECT cs.* , CASE WHEN @p= ...
group by 查询分组后 组的条数
⽐如select gid from table group by gid 查询时使⽤下⾯的⽅法查询条数 select count(distinct gid) from table 使⽤select c ...
sql的 group by 分组;linq的 group by 分组
先来看看 linq的,下⾯的⼀段linq 是 ,在 学⽣导⼊数据的时候,我们根据学⽣的⼿机号码和学⽣名称进⾏分组,如果有重复的,我们就筛选出来,⽤到了 linq的 group by,注意这⾥是new出 ...
随机推荐
Hadoop学习笔记—13&period;分布式集中节点的动态添加与下架
开篇:在本笔记系列的第⼀篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集.现在,我们来了解⼀下在⼀个Hadoop分布式集中,如何动态(不关机且正在运⾏的情况下)地添加⼀个Hadoop节点与 ...
Frame创建窗体实例
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Fram ...
OK6410移植madplay播放器&comma;王明学learn
对于ok6410的madplay移植主要包括三部分.声卡驱动移植,播放器的移植,以及alsa库的移植. ⼀.⾸先移植声卡驱动以及播放器 ok6410采⽤WM97系列的声卡芯⽚,要使得内核⽀持该驱动,⾸ ...
ruby Errors &; Exceptions
When you first started coding, errors were probably the last thing you wanted to see. After all, it’ ...
iOS开发——UI篇Swift篇&&semi;玩转UItableView(⼆)⾼级功能
UItableView⾼级功能 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewD ...
C语⾔中的结构体和C++中的结构体以及C++中类的区别
c++中结构体可以定义⼀个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能⾃定义数据类型,结构体中不允许有函数,⽽
C++中的结构体可以加⼊成员函数. C++中的结构体和类的异同: ⼀. ...
关于ssh登录出现异常警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
提⽰警告信息如下: arnold@WSN:~$ ssh 10.18.46.111
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
CSS3常⽤功能的写法 转
CSS3常⽤功能的写法 作者: 阮⼀峰 随着浏览器的升级,CSS3已经可以投⼊实际应⽤了. 但是,不同的浏览器有不同的CSS3实现,兼容性是⼀个⼤问题.上周的YDN介绍了CSS3 Please⽹站 ...
[leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论