主知识点八:窗口函数
新开窗口,不影响原数据的排序。且子句必须有order by。窗口结果返回到
且窗口函数必须写在select后面!
● 【排序窗口函数】
● rank()over()——1,1,3,4
● dense_rank()over()——1,1,2,3
● row_number()over()——1,2,3,4
【例题29】查询每一年S14000021选区中所有候选人所在的团体(party)和得票数(votes),并对每一年中的所有候选人根据选票数的高低赋予名次,选票数最高则为1,第二名则为2,后续以此类推,最后根据团体(party)和年份(yr)排序。
分析:
(1)查询团体(party)和得票数(votes)
(2)每一年的,S14000021选区的
(3)每一年中的所有候选人根据选票数的高低赋予名次——窗口函数rank()over(partition by yr order by votes desc)
(4)根据团体(party)和年份(yr)排序。
代码:
select yr,party,votes,rank()over(partition by yr order by votes desc)as posnfrom gewhere constituency='S14000021'order by party,yr
● 【偏移分析函数】
● lag(字段名,偏移量[,默认值])over()——当前行向上取值“偏移量”行
● lead(字段名,偏移量[,默认值])over()——当前行向下取值“偏移量”行
● 【例题30】查询法国和德国1月每天新增确诊人数,最后显示国家名、标准日期(2020-01-27)、当天截至时间累计确诊人数、昨天截至时间累计确诊人数、每天新增确诊人数,按照截至时间排序
分析:
(1)法国和德国1月每天新增确诊人数——where name in ('France','Germany') and month(whn) = 1
(2)最后显示国家名、标准日期(2020-01-27)、——date_format(whn,'%Y-%m-%d') date
当天截至时间累计确诊人数、——原表中的confirmed
昨天截至时间累计确诊人数、——,lag(confirmed,1)over(partition by name order by whn),当前行往上取1行,再取这一行的confirmed的值,
每天新增确诊人数
(3)按照截至时间排序
代码:
selectname,date_format(whn,'%Y-%m-%d') date,confirmed 当天截至时间累计确诊人数,lag(confirmed,1)over(partition by name order by whn) 昨天截至时间累计确诊人数,(confirmed - lag(confirmed,1)over(partition by name order by whn)) 每天新增确诊人数from covidwhere name in ('France','Germany') and month(whn) = 1order by whn
结果:
● 【总结】
● 【排序窗口函数语法】
● rank()over([partition by 字段名] order by 字段名 asc|desc)
● dense_rank()over([partition by 字段名] order by 字段名 asc|desc)
● row_number()over([partition by 字段名] order by 字段名 asc|desc)
● 【偏移分析函数语法】
● lag(字段名,偏移量[,默认值])over([partition by 字段名] order by 字段名 asc|desc)
● lead(字段名,偏移量[,默认值])over([partition by 字段名] order by 字段名 asc|desc)
● 【题目】查询2017年选区为 'S14000024' 的所有候选人所在团体(party)和其选票数(votes)、还有候选人得票数在选区内对应的的排名,结果按团队party排序。
分析:
(1)查询候选人所在团体(party)和其选票数(votes)、
还有候选人得票数在选区内对应的的排名,
(2)2017年选区为 'S14000024' 的 ——where yr=2017 and constituency='S14000024'
(3)结果按团队party排序——order by party
代码:
select party,votes,rank()over(partition by constituency order by votes desc)as sortfrom gewhere yr=2017 and constituency='S14000024'order by party
● 【题目】查询截至时间为2020年4月20日的国家名,确诊人数,确诊人数排名,死亡人数,死亡人数排名,按照确诊人数降序排名。
分析:
(1)查询国家名,确诊人数,确诊人数排名,死亡人数,死亡人数排名,
(2)截至时间为2020年4月20日的
(3)按照确诊人数降序排名。
代码:
select name,confirmed,rank()over(order by confirmed desc) cr,deaths,rank()over(order by deaths desc) drfrom covidwhere whn='2020-4-20'order by confirmed desc
● 【题目】查询意大利每周新增确诊数(显示每周一的数值 weekday(whn) = 0),最后显示国家名,标准日期(2020-01-27),每周新增人数,按照截至时间排序。
分析:
(1)查询意大利每周新增确诊数——每周,两个相邻周一的数据相减就是这周的确诊数
(2)显示每周一的数值 weekday(whn) = 0,
(3)最后显示国家名,标准日期(2020-01-27),每周新增人数,
(4)按照截至时间排序。
代码:
select name,date_format(whn,'%Y-%m-%d') date,(confirmed-lag(confirmed,1)over(partition by name order by whn))from covidwhere weekday(whn)=0 and name = 'Italy'order by whn
主知识点九:表链接
。。。