樓上例子很經(jīng)典,但補充兩點: 1. 使用DISTINCT與不使用DISTINCT,對FIRST_VALUE函數(shù)是有區(qū)別的,使用DISTINCT的FIRST_VALUE函數(shù)效果等類似于SQL Server中的first(),取得所有分組中的第一條數(shù)據(jù)。 如果不使用DISTINCT,F(xiàn)IRST_VALUE函數(shù)的執(zhí)行結(jié)果,按照樓上
樓上例子很經(jīng)典,但補充兩點:
1. 使用DISTINCT與不使用DISTINCT,對FIRST_VALUE函數(shù)是有區(qū)別的,使用DISTINCT的FIRST_VALUE函數(shù)效果等類似于SQL Server中的first(),取得所有分組中的第一條數(shù)據(jù)。
如果不使用DISTINCT,F(xiàn)IRST_VALUE函數(shù)的執(zhí)行結(jié)果,按照樓上的例子,按照POS分組,對于每個NAME,都返回本組的第一個值(first_value)
SELECT DISTINCT
FIRST_VALUE(NAME) OVER
(PARTITION BY POS ORDER BY AGE DESC)
AS MAXAGE_NAME
,FIRST_VALUE(NAME) OVER
(PARTITION BY POS ORDER BY AGE ASC)
AS MINAGE_NAME
,AVG(AGE) OVER
(PARTITION BY POS)
AS AVG_AGE
,POS
FROM EMP
ORDER BY POS
運行結(jié)果
MAXAGE_NAME MINAGE_NAME AVG_AGE POS
1 E C33.6666666666667 PL
2 E C33.6666666666667 PL
3 E C33.6666666666667 PL
4 A B 22.5 PM
5 A B 22.5 PM
2.性能,
通常使用DISTINCT都會造成SQL在運行上性能的損失,但具體損失多少,一般大家沒有直觀的感受,
根據(jù)使用工具Toad(Tools of Oracle Application Developers)的分析結(jié)果,相同的SQL使用DISTINCT與使用ROWNUM = 1兩種寫法, DISTINCT在性能上的損失高達30%以上,證據(jù)會在下面給出。
DISTINCT的寫法
SELECT DISTINCT
FIRST_VALUE(NAME) OVER
(PARTITION BY ID ORDER BY AGE DESC)
AS MAXAGE_NAME
FROM EMP
ORDER BY POS
ROWNUM = 1的寫法
SELECT MAXAGE_NAME
(SELECT
FIRST_VALUE(NAME) OVER
(PARTITION BY ID ORDER BY AGE DESC)
AS MAXAGE_NAME
FROM EMP
ORDER BY POS) T
WHERE ROWNUM = 1
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com