sql取最⼤值的那⼀⾏_SQL学习-⾼级功能⼀、窗⼝函数
对数据库数据进⾏实时分析处理。窗⼝函数也称为OLAP函数。OLAP是online analytical processing的简称,意思是对数据库数据进⾏实时分析处理解决:
⽤于解决
1.排名问题:每个部门按业绩排名
功能
功能:
1)同时具有分组和排序的功能
⾏数
2)不减少原表的⾏数
语法:
基本语法
‹窗⼝函数› over (partition by ‹⽤于分组的列名›
order by ‹⽤于排序的列名›)
‹窗⼝函数›的位置,可以放以下两种函数:
1) 专⽤窗⼝函数,包括后⾯要讲到的rank, dense_rank, row_number等专⽤窗⼝函数。
2) 聚合函数,如sum, avg, count, max, min等
窗⼝函数原则上只能写在select⼦句中。
因为窗⼝函数是对where或者group by⼦句处理后的结果进⾏操作,所以窗⼝函数原则上只能写在select⼦句中。
1.专⽤窗⼝函数rank
<
如果我们想在每个班级内按成绩排名,得到下⾯的结果。
select *,
rank() over
(partition by 班级
order by 成绩 desc) as ranking
from 班级表
partition by⽤来对表分组,order by⼦句的功能是对分组后的结果进⾏排序注:partition by⽤来对表分组,order by⼦句的功能是对分组后的结果进⾏排序partition by分组后的结果称为“窗⼝”,表⽰“范围”的意思
2.专⽤窗⼝函数rank, dense_rank, row_number的区别
select *,
rank() over (order by 成绩 desc) as ranking,
dense_rank() over (order by 成绩 desc) as dese_rank,
row_number() over (order by 成绩 desc) as row_num
from 班级表
结果:
案例
案例1:涉及到“⾯试经典排名问题”“⾯试经典排名问题”应区分rank()rank(), dese dese _rank(), row_number()
row_number()三者的区别。案例2:topN问题topN问题
⼯作中会经常遇到这样的业务问题:
如何到每个类别下⽤户最喜欢的产品是哪个?
如何到每个类别下⽤户点击最多的5个商品是什么?
思路:分组取每组最⼤值、最⼩值,每组最⼤的N条(top N)记录分组取每组最⼤值、最⼩值,每组最⼤的N条(top N)记录
1.分组取每组最⼤值
若以简单的group by函数取最⼤值,⽆法取得最⼤值所在⾏的数据
以关联⼦查询得到
select *  from score as a
where 成绩 =
( select max(成绩)  from score as b
where b.课程号 = a.课程号);
同理,每组最⼩值也由关联⼦查询得到。
2.每组最⼤的N条记录(topN)
问题:查每个学⽣成绩最⾼的2个科⽬
思路:
1.看到“每个”要想到分组
分组,此题可按姓名分组
2.分组后,按成绩降序排列,排在最前⾯的2个即为所求
3.分组排序后,不能减少原表的⾏数,所以需要⽤到窗⼝函数
4.为了不受并列成绩的影响,使⽤row_number专⽤窗⼝函数步骤⼀:
select *,
row_number() over
(partition by 姓名
order by 成绩 desc) as ranking from 成绩表;
每天学点sql经典句子
步骤⼆:每个同学成绩最好的2个科⽬,就是要求的解。要提取出“ranking”值⼩于等于2的数据。
select *,
row_number() over
(partition by 姓名
order by 成绩 desc) as ranking from 成绩表
where ranking ‹=2;
⼦查询。此时运⾏SQL查询时会报错,因为sql书写顺序与运⾏顺序不⼀样。在运⾏where语句时ranking列并没有出现,此时需要⽤到⼦查询
select * from
(select *,
row_number() over
(partition by 姓名
order by 成绩 desc) as ranking  from 成绩表) as a
where ranking ‹= 2;
举⼀反三:
# topN问题 sql模板
select * from
(select *,
row_number() over
(partition by 要分组的列名
order by 要排序的列名 desc) as ranking  from 表名) as a
where ranking ‹= N;
⼆、聚合函数
聚和窗⼝函数和上⾯提到的专⽤窗⼝函数⽤法完全相同,只需要把聚合函数写在窗⼝函数的位置即可,但是函数后⾯括号⾥⾯不能为空
括号⾥⾯不能为空,需要指定聚合的列名。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。