sql窗口函数
1.row_number() over(partition by col_name order by col_name) as ranking
2.rank() over(partition by col_name order by col_name) as ranking
3.dense_rank() over(partition by col_name order by col_name) as
rank() over(partition by col_name order by col_name) as ranking
作用:按字段分组并按字段排序,并加上序号列
例如:
比如 一个学生考试成绩表score中有三个字段,course_id,stu_id,score, 想得到每门课的前三名
select course_id, row_number() over(partition by course_id order by score desc) as ranking
from score
where ranking<=3;
作用rank() row_number(), dense_rank()的作用其实介绍在末尾加上序号列,ranking。 这三个函数需要配合窗口函数over()使用
三者的区别
4.lead() over() 和lag over()
lead(字段名,n) over() 将某一列往下推n行,上面的n个用NULL填充;
lag(字段名,n) over() 将某一列往上推n行,下面的n个用NULL填充;
lag(字段名,n,x) over () :取值向前偏移n行,并将空值填充为数字x(空间的理解就是直接将一列数据往前后n个位置,前面的空出来的位置用X填充上,具体配合图片理解) 。
这种错位常用于比较某一列自身的差值,比如下一行减上一行
SELECT id,score,Lead(score,2) over(order by id) lead_score,-- score数列向前推动2位,后面就腾空了2个位置
Lag(score,2) over(order by id) lag_score, -- score数列向后推2位,腾空2个位置
lag(score,2,666) over(order by id) lag_score_3 -- score数列向后推动2位,空值被填充为666
FROM exam_record;
sql日期函数
1.datediff(时间1,时间2):计算两个日期之间间隔的天数,单位为日
2.timestampdiff(时间单位,开始时间,结束时间):两个日期的时间差,返回的时间差形式由时间单位决定(日,周,月,年)
date_add(日期,INTERVAL n 时间单位) :返回加上n个时间单位后的日期
3.date_sub(日期,INTERVAL n 时间单位 ):返回减去n个时间单位后的日期
4.date_format(时间,‘%Y-%m-%d’):强制转换时间为所需要的格式
例子
连续两次作答试卷的最大时间窗
with t2 as(
select
uid,
count(start_time) as total,
DATEDIFF(MAX(start_time),MIN(start_time))+1 diff_time,
MAX(DATEDIFF(next_time,start_time))+1 as days_window
from(
select uid,start_time,
LEAD(start_time,1) over(partition by uid order by start_time) as next_time
from exam_record
where year(start_time)=2021
)t1
group by uid
)
select
uid,
days_window,
round(total/diff_time*days_window,2) as avg_exam_cnt
from
t2
where diff_time>=2
order by days_window desc, avg_exam_cnt desc
参考:
CSDN,牛客,51CTO