美文网首页
2020-04-01-(3)

2020-04-01-(3)

作者: DUYAN_bc77 | 来源:发表于2020-04-01 22:27 被阅读0次

排名问题

Create table If Not Exists Scores (Id int, Score DECIMAL(3,2))
Truncate table Scores
insert into Scores (Id, Score) values ('1', '3.5')
insert into Scores (Id, Score) values ('2', '3.65')
insert into Scores (Id, Score) values ('3', '4.0')
insert into Scores (Id, Score) values ('4', '3.85')
insert into Scores (Id, Score) values ('5', '4.0')
insert into Scores (Id, Score) values ('6', '3.65')
+----+-------+       
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+
#返回 按分数从高到低排列
+-------+------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

窗口函数

也叫OLAP(Online Analytical Processing, 联机分析处理),可以对数据库数据进行实时分析处理

排名问题:每个部门按业绩来排名
topN问题:找出每个部门排名前N的员工进行奖励

语法

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

<窗口函数>:两种

  1. 专用窗口函数: rank, dense_rank, row_number
  2. 聚合函数:sum, avg, count, max, min

因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中

group by分组汇总后改变了表的行数,一行只有一个类别。而partiition by和rank函数不会减少原表中的行数

窗口表示范围,能够

  1. 同时具有分组和排序的功能
  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 班级表

输出:


image.png

rank:并列排名,不占用下一名次位置 【1,2,3,4,4,4,7】
dense_rank: (密集排名)并列排名,不占用下一名次位置【1,2,3,4,4,4,5】
row_number:正常排名【1,2,3,4,5,6,7】

三个专用窗口函数中,函数后面的括号不需要任何参数,保持()空着就可以

聚合函数为窗口函数

select *,
   sum(成绩) over (order by 学号) as current_sum,
   avg(成绩) over (order by 学号) as current_avg,
   count(成绩) over (order by 学号) as current_count,
   max(成绩) over (order by 学号) as current_max,
   min(成绩) over (order by 学号) as current_min
from 班级表

输出:


image.png

聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。

partition子句可是省略,省略就是不指定分组

https://zhuanlan.zhihu.com/p/92654574

相关文章

  • 2020-04-01-(3)

    排名问题 窗口函数 也叫OLAP(Online Analytical Processing, 联机分析处理),可以...

  • 2020-04-01-摘抄

    今天摘抄小马宋的《朋友圈的尖子生》。 在非科学技术领域,我觉得这个世界上有两种学习方式,一种是通过大量的案例研究和...

  • 2020-04-01-(2)

    找到Second 输入 输出 Solution 1 使用子查询找到最高salary记为SecondHighestS...

  • 2020-04-01-青橄榄树-灵修日粮-诗-31

    【诗31:1/24节】(大卫的诗,交与伶长。)耶和华啊,我投靠祢,求祢使我永不羞愧,凭祢的公义搭救我。求祢侧耳而听...

  • 恶意文件夹

    【%你的iapp在这里哦/恭喜你找到了/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3/3...

  • 3+3+3

    九年了,不曾去过,马路那边的刘家村。唱戏,小路~抓蝌蚪,洗衣服,捞水草,漩涡~种满菜的田地,养着奶牛的茅草屋,充满...

  • 3/3

    郭一博 刘佐千 李文浩 王天聪 柳絮 刘全利 李明东

  • 3/3

  • if(a==3) or if(3==a)

    记得刚写程序那会儿,遇到 if else 的条件判断逻辑,基本都会这样写:if(a==3) 为什么呢? 因为自然...

  • 3/3

    原先我是为了他留长头发,现在他的女朋友剪了短发,他说随她去,都好。 原先她卑微付出真心为他,现在她是个被宠溺的幸福...

网友评论

      本文标题:2020-04-01-(3)

      本文链接:https://www.haomeiwen.com/subject/kzjzuhtx.html