分析函數--FIRST_VALUE,LAST_VALUE,LAG,LEAD,ROW_NUMBER

一 ,FIRST_VALUE,LAST_VALUER的使用
1,FIRST_VALUE 是指返回組中數據窗口的第一個值
2,LAST_VALUE 是指返回組中數據窗口的最後一個值(注意點:不受排序的影響,後面發現是因爲沒有開窗導致的)

例子:
SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
HIRE_DATE,
SALARY,
FIRST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS LOWEST_SAL,
FIRST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS HIGHEST_SAL,
LAST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS LAST_SAL,
LAST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS LAST_SAL_DESC
FROM HR.EMPLOYEES


上面的例子,並不能得到期待結果。
原因是沒有指定開窗子句,
order by會加上一個默認窗口RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
正確的寫法:
增加上指定窗口爲所有行--ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
HIRE_DATE,
SALARY,
FIRST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS LOWEST_SAL,
FIRST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS HIGHEST_SAL,
LAST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_SAL,
LAST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC
LAST_VALUE(FIRST_NAME || ' ' || LAST_NAME || ':'|| SALARY) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_SAL_DESC
FROM HR.EMPLOYEES


二,LAG,LEAD函數的使用
1,LAG可以訪問結果集中的其它行而不用進行自連接。它允許去處理遊標,就好像遊標
是一個數組一樣。在給定組中可參考當前行之前的行,這樣就可以從組中與當前行一起選擇
以前的行。Offset 是一個正整數,其默認值爲 1,若索引超出窗口的範圍,就返回默認值(默
認返回的是組中第一行),其相反的函數是 LEAD
2,LEAD 與 LAG 相反,LEAD 可以訪問組中當前行之後的行。Offset 是一個正整數,
其默認值爲 1,若索引超出窗口的範圍,就返回默認值(默認返回的是組中第一行)

例子:
SELECT FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
HIRE_DATE,
SALARY,
LAG(SALARY, 1, 0) OVER(ORDER BY HIRE_DATE ) AS 比當前前一個的薪酬,
LEAD(SALARY, 1, 0) OVER(ORDER BY HIRE_DATE ) AS 比當前後一個的薪酬
FROM HR.EMPLOYEES



三,ROW_NUMBE的使用
1,ROW_NUMBE是指 返回有序組中一行的偏移量,從而可用於按特定標準排序的行號。
也可以利用他排除重複的數據

例子:

SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
EMPLOYEE_ID,
ROW_NUMBER() OVER(PARTITION BY DEPARTMENT_ID ORDER BY EMPLOYEE_ID) AS EMP_ID
FROM HR.EMPLOYEES



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章