1. 程式人生 > 其它 >【視窗函式和group by 一起使用的案例】

【視窗函式和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後的查詢結果(而不是基於每組組內的查詢結果)。