SQL_窗口函数

1.窗口函数与分析函数

看到一篇写的很好的总结了,就把链接附上把,我们主要是结合一些题目看一下具体的用法(https://blog.csdn.net/scgaliguodong123_/article/details/60135385)

1.1 窗口函数

  • FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
  • LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值
  • LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
  • LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
  • OVER从句

1.2 分析函数

  • ROW_NUMBER() 从1开始,按照顺序,生成分组内记录的序列,比如,按照pv降序排列,生成分组内每天的pv名次,ROW_NUMBER()的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。
  • RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
  • DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
  • CUME_DIST 小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例
  • PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
  • NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。

1.3 分类

分为两类,

  • 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
  • 聚合函数,如sum. avg, count, max, min等

2. 用例

2.0 数据

数据很简单,是自己随便做的一个成绩单。用这个数据集将做些逐渐深入的用例(后续可能会追加)
SQL_窗口函数_第1张图片

2.1 对不同ID按成绩降序排列,并标记是第几门科目

用途:研究复购率、多次进线数等

select ID,
       sub,
	   score,
	   row_number() over(partition by ID order by score desc) 
from sc ;

2.2 找出每名同学排名前二的科目和成绩。

select 
    a.ID,
	a.sub,
	a.score,
	a.rk
from (
    select *,
		   rank() over(partition by ID order by score desc)  as rk
	from sc 
) a
where rk <= 2

SQL_窗口函数_第2张图片

2.3 选出每科排名前二的学生ID及对应成绩

select 
    a.sub,
    a.ID,
	a.score,
	a.rk
from (
    select *,
		   rank() over(partition by sub order by score desc)  as rk
		from sc 
) a
where rk <= 2

SQL_窗口函数_第3张图片

你可能感兴趣的:(SQL,SQL,窗口函数)