【窗口函数和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后的查询结果(而不是基于每组组内的查询结果)。

浙公网安备 33010602011771号