【視窗函式和group by 一起使用的案例】
阿新 • • 發佈:2022-05-30
建立一張表,包括時間、學生學號、考勤狀態
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後的查詢結果(而不是基於每組組內的查詢結果)。