【窗口函数和group by 一起使用的案例】

创建一张表,包括时间、学生学号、考勤状态

insert into px_data_test_temp.temp_stu_attendance_tb  
(date_col, stu_no, is_attendence) 
values 
('2019-11-01','STU-00001','上课'),
('2019-11-02','STU-00001','上课'),
('2019-11-03','STU-00001','缺勤'),
('2019-11-04','STU-00001','上课'),
('2019-11-05','STU-00001','上课'),
('2019-11-06','STU-00001','上课'),
('2019-11-07','STU-00001','上课'),
('2019-11-08','STU-00001','上课'),
('2019-11-09','STU-00001','缺勤'),
('2019-11-10','STU-00001','缺勤'),
('2019-11-11','STU-00001','上课'),
('2019-11-12','STU-00001','上课'),
('2019-11-13','STU-00001','上课'),
('2019-11-14','STU-00001','上课'),
('2019-11-15','STU-00001','缺勤'),
('2019-11-16','STU-00001','缺勤'),
('2019-11-17','STU-00001','缺勤'),
('2019-11-18','STU-00001','上课'),
('2019-11-19','STU-00001','上课'),
('2019-11-20','STU-00001','上课'),
('2019-11-01','STU-00002','上课'),
('2019-11-02','STU-00002','缺勤'),
('2019-11-03','STU-00002','缺勤'),
('2019-11-04','STU-00002','上课'),
('2019-11-05','STU-00002','上课'),
('2019-11-06','STU-00002','上课'),
('2019-11-07','STU-00002','上课'),
('2019-11-08','STU-00002','上课'),
('2019-11-09','STU-00002','缺勤'),
('2019-11-10','STU-00002','缺勤'),
('2019-11-11','STU-00002','上课'),
('2019-11-12','STU-00002','上课'),
('2019-11-13','STU-00002','上课'),
('2019-11-14','STU-00002','上课'),
('2019-11-15','STU-00002','上课'),
('2019-11-16','STU-00002','缺勤'),
('2019-11-17','STU-00002','缺勤'),
('2019-11-18','STU-00002','上课'),
('2019-11-19','STU-00002','上课'),
('2019-11-20','STU-00002','上课');

写sql求每一天中的上课人数,并按日期从小到大排名

select 
    date_col,
    count(*) as total,
    row_number() over (order by date_col) as rn
from temp_stu_attendance_tb
where is_attendence = '上课'
group by date_col;

结果

date_col    total   rn 
2019-11-01  2   1
2019-11-02  1   2
2019-11-04  2   3
2019-11-05  2   4
2019-11-06  2   5
2019-11-07  2   6
2019-11-08  2   7
2019-11-11  2   8
2019-11-12  2   9
2019-11-13  2   10
2019-11-14  2   11
2019-11-15  1   12
2019-11-18  2   13
2019-11-19  2   14
2019-11-20  2   15

总结

1、窗口函数是写在select子句中的,而窗口函数开窗范围是基于后面的所有查询结果。对每行结果进行开窗操作,然后每行都在这个窗口范围内执行聚合函数进行统计。统计结果作为这一行的一个字段值。所以本案例中,先group by 之后再rank()

2、窗口函数与group by一起使用并不冲突。窗口函数也是基于整个group by后的查询结果(而不是基于每组组内的查询结果)。

posted @   tootooquan  阅读(1977)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示