mysqlcount排序_SQL进阶排序和窗口函数
mysqlcount排序_SQL进阶排序和窗⼝函数
在使⽤数据库制作各种统计数据的时候,需要对数据进⾏排序,⽐如按照「分数、销量、⼈数」等数值进⾏排序,通常排序的⽅法有两种:跳过之后的位次排序
不跳过之后的位次排序
窗⼝函数
窗⼝函数只在最新的MySQL版本中才⽀持的!
窗⼝函数只在最新的MySQL版本中才⽀持的!
窗⼝函数只在最新的MySQL版本中才⽀持的!
什么是窗⼝函数
窗⼝函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进⾏实时分析处理。语法
窗⼝函数的基本语法:
over (partition by  -- partition⼦句可省略,不指定分组
order by )
的位置上可以放两种函数:
专⽤窗⼝函数,rank、dense_rank、row_number等
聚合函数,如sum、avg、count、max、min等
因为窗⼝函数是对where或者group by⼦句处理后的结果进⾏操作,所以「窗⼝函数原则上只能写在select⼦句中」。功能
同时具有分组和排序的功能
不改变原有表的⾏数
窗⼝函数原则上只能写在select⼦句中
实际场景rank函数的用法
排名问题:每个部门按业绩来排名
topN问题:出每个部门排名前N的员⼯进⾏奖励
rank/dense_rank/row_number
实例
rank:并列跳跃排名
dense_rank:并列连续排名
row_number:连续排名
这3个函数的区别通过⼀个列⼦可以清楚地看到:
select
name,price,
rank() over (order by price desc) as rank_1,
dense_rank() (order by price desc) as rank_2,
row_number() (order by price desc) as rank_3
from products;
结论
name        price    rank_1    rank_2    rank_3
橘⼦          100          1          1      1
西⽠          80          2          2      2
苹果          50          3          3      3
⾹蕉          50          3          3      4
葡萄          50          3          3      5
柠檬          30          6          4      6
总结:
rank()在出现了相同位次之后,跳过了相同的位次
dense_rank()则没有跳过相同的位次
row_number()按照⾃然数的顺序进⾏排列
在上述的这三个专⽤窗⼝函数中,函数后⾯的括号不需要任何参数,保持()空着就可以。
知乎例⼦
实现rank()
select *,
rank() over (partition by 班级  -- 先分组
order by 成绩 desc) as ranking  -- 再排序
from 班级表
不改变⾏数
⾮等值连接实现rank()
select p1.name,p1.price,
(select count(p2.price)
from products p2
where p2.price > p1.price) + 1      as rank_1
from products
order by rank_1;

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