最简单的就是 select * from 表名 where <查询条件> group by <分组字段> having <分组后筛选条件> order by 排序字段 limit 查询起始行号,查询数量。
今天新学了个 开窗函数/分析函数
1.常见的能够作为开窗函数的聚合函数(sum,avg,count,max,min)
2.rank,dense_rank,row_number 等专用开窗函数。
直接写sql语句
create table sc(
sid varchar(10) null comment '学生id',
cid varchar(10) null comment '课程id',
score decimal(18, 1) null comment '分数'
)
comment '分数表'; # 比如说前二名的分数都是100,第三名分数是99
-- rank():用于计算指定列的排名。生成的序号可能重复, 则排序就是 1 1 3...
select cid, score, rank() over (partition by cid order by score desc ) ‘序号’ from sc ;
-- row_number():用于给结果集中的每一行分配一个唯一的行号。生成的序号不重复,则排序就是 1 2 3 ...
select cid, score ,row_number( ) over(partition by cid order by score desc ) '序号' from sc;
-- dense_rank:在生成序号时是连续的。生成的序号可能重复但是不会断,则排序是 1 1 2 ...
select cid, score, dense_rank() over ( partition by cid order by score desc ) '序号' from sc;
-- 三者的应用,个人拙见,比如说要求分数最高的前3个分数则可以用 rank() ,毕竟最高的3个分数固定死了,查询前3名学生就可以直接用row_number 毕竟只需要3个学生就行了
-- 但是如果有10个人都是100分这前3名就不公平了,要找出分数前3的所有学生 这时候用 dense_rank () 数据库所有数据:
-- 这个就很奇怪了,如果前2名分数一样则第三个人的序号就3,但是如果前2名分数一样,3,4名分数一样则前面4个人的序号分别为1 1 3 3 第5个人的序号就从5开始
select * from (select cid,score , rank() over (partition by cid order by score desc ) ‘序号’ from sc) t1 where ‘序号’ <=3;
-- 找出每科分数前三的学生(3科 只能找出9个人)
select * from (select cid ,score ,row_number( ) over(partition by cid order by score desc ) '序号' from sc) t1 where 序号 <=3;
-- 下面是前三的分数的所有学生(比如说前三的分数为100,99,98 找出分数符合的所有学生)
select * from (select cid, score, dense_rank() over ( partition by cid order by score desc ) '序号' from sc) t1 where 序号<=3;
标签:语句,分数,cid,rank,序号,score,sql,dql,select From: https://www.cnblogs.com/dz-154/p/17689653.html