窗口函數之range的用法(讀書筆記三)

--RANGE的具體用法
SELECT
emp_id,emp_name,dept_id,hire_date,salary,
--首先按dept_id進行分組,其次按照hire_date進行排序,然後再把入職時間小於等於自身的所有員工薪資進行累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date) sum_salary_part_order,
--按照dept_id進行分組,並統計該部門下所有員工的薪資
SUM(salary) OVER(PARTITION BY dept_id) sum_salary_part,
--直接按照hire_date進行分組,再把入職時間小於等於自身的所有員工薪資進行累計
SUM(salary) OVER(ORDER BY hire_date) sum_salary_order,
--後面均爲首先按dept_id進行分組,其次按照hire_date進行排序,且所有統計不能跨越其所在分區,故不再重複
--且由於是邏輯範圍,因此在PRECEDING和FOLLOWING的表達式上是有符號的
--窗口範圍爲該分區的第一行和該分區的最後一行,與sum_salary_part等同,在非條件表達式中等同於rows
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) sum_1,
--窗口範圍爲該分區的第一行和本行,與sum_salary_part_order等同,在非條件表達式中等同於rows
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum_2,
--窗口範圍爲該分區內小於本記錄hire_date-365天的所有的薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN UNBOUNDED PRECEDING AND 365/*value_expr*/ PRECEDING) sum_3,
--窗口範圍爲該分區內小於本記錄hire_date+365天的所有的薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN UNBOUNDED PRECEDING AND 365/*value_expr*/ FOLLOWING) sum_4,
--窗口範圍爲本行和該分區的最後一行,統計的是大於等於本記錄hire_date之後的所有薪資,在非條件表達式中等同於rows
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) sum_5,
--窗口範圍是本行,所以與本行薪資一樣
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN CURRENT ROW AND CURRENT ROW) sum_6,
--窗口範圍爲該分區內本記錄起和小於本記錄hire_date+365天的所有的薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN CURRENT ROW AND 365/*value_expr*/ FOLLOWING) sum_7,
--窗口範圍爲該分區內大於本記錄hire_date—365天和該分區最後一行的所有薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 365/*value_expr*/ PRECEDING AND UNBOUNDED FOLLOWING) sum_8,
--窗口範圍爲該分區內大於本記錄hire_date-365天,並且截止到當前記錄的所有的薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 365/*value_expr*/ PRECEDING AND CURRENT ROW) sum_9,
--窗口範圍爲該分區的本行current_value-value_expr1到本行current_value-value_expr2的累計,強調value_expr1>=value_expr2
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 365/*value_expr1*/ PRECEDING AND 30/*value_expr2*/ PRECEDING) sum_10,
--窗口範圍爲該分區的本行current_value-value_expr1到本行current_value+value_expr2的累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 365/*value_expr*/ PRECEDING AND 30/*value_expr*/ FOLLOWING) sum_11,
--窗口範圍爲該分區內大於本記錄hire_date+365天的所有的薪資累計
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 365/*value_expr*/ FOLLOWING AND UNBOUNDED FOLLOWING) sum_12,
--窗口範圍爲該分區的本行current_value+value_expr1到本行current_value+value_expr2的累計,本例爲本行後1行和後2行的累計,強調value_expr1<=value_expr2
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE BETWEEN 30/*value_expr1*/ FOLLOWING AND 365/*value_expr2*/ FOLLOWING) sum_13,
--窗口範圍爲該分區的第一行,結束行默認本行,與sum_salary_part_order,sum_2等同,在非條件表達式中等同於rows
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE UNBOUNDED PRECEDING) sum_14,
--窗口範圍僅爲當前行,所以與本行薪資一樣,與sum_6一樣,在非條件表達式中等同於rows
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE CURRENT ROW) sum_15,
--窗口範圍爲該分區內大於本記錄hire_date-365天,並且截止到當前記錄的所有的薪資累計,與sum_9等價
SUM(salary) OVER(PARTITION BY dept_id ORDER BY hire_date 
RANGE 365/*value_expr*/ PRECEDING) sum_16
FROM employeeinfo
ORDER BY dept_id,hire_date;


發佈了50 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章