0
点赞
收藏
分享

微信扫一扫

SQL日期函数与窗口函数

茗越 2022-04-30 阅读 56

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

举报

相关推荐

0 条评论