日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle 排序的分析函数,Oracle分析函数用法详解

發(fā)布時(shí)間:2024/10/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 排序的分析函数,Oracle分析函数用法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OVER(PARTITION BY)開(kāi)窗函數(shù)用法

開(kāi)窗函數(shù),Oracle從8.1.6開(kāi)始提供開(kāi)窗函數(shù),開(kāi)窗函數(shù)用于計(jì)算基于組的某種聚合值,它和聚合函數(shù)的不同之處是:

對(duì)于每個(gè)組返回多行,而聚合函數(shù)對(duì)于每個(gè)組只返回一行。

開(kāi)窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個(gè)數(shù)據(jù)窗口大小可能會(huì)隨著行的變化而變化。

開(kāi)窗的窗口范圍

-- 窗口范圍為當(dāng)前行數(shù)據(jù)幅度減3加3后的范圍內(nèi)的.

/*SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

,SUM(T1.COURSE_SCORE) OVER(ORDER BY COURSE_SCORE RANGE BETWEEN 3 PRECEDING AND 3 FOLLOWING) SUM_SCORE

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88'*/

/*1 高蓉蓉 1班 76 155 76,79

2 雷蕾 1班 79 237 76,79,82

3 楊正坤 1班 82 331 79,82,85,85

4 李永承 1班 85 252 82,85,85

5 敬金鳳 1班 85 252 82,85,85 */

窗口范圍為當(dāng)前行前后各移動(dòng)1,0行

/*SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

,SUM(T1.COURSE_SCORE) OVER(ORDER BY COURSE_SCORE ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) SUM_SCORE

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88'

*/

/*1 高蓉蓉 1班 76 76 76

2 雷蕾 1班 79 155 76,79

3 楊正坤 1班 82 161 79,82

4 李永承 1班 85 167 82,85

5 敬金鳳 1班 85 170 85,85 */

窗口不做限制

/*SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

,SUM(T1.COURSE_SCORE) OVER(ORDER BY COURSE_SCORE RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) SUM_SCORE1

,SUM(T1.COURSE_SCORE) OVER(ORDER BY COURSE_SCORE ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) SUM_SCORE2

,SUM(T1.COURSE_SCORE) OVER() SUM_SCORE3

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88'*/

/*1 高蓉蓉 1班 76 407 407 407

2 雷蕾 1班 79 407 407 407

3 楊正坤 1班 82 407 407 407

4 李永承 1班 85 407 407 407

5 敬金鳳 1班 85 407 407 407*/

與OVER函數(shù)結(jié)合的幾個(gè)函數(shù)介紹

/*與OVER函數(shù)結(jié)合的幾個(gè)函數(shù)介紹

ROW_NUMBER() OVER()、RANK() OVER()和DENSE_RANK() OVER()函數(shù)的使用

RANK 跳躍排序

DENSE_RANK 連續(xù)排序

*/

/*SELECT T.*

,RANK() OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE DESC) SCORE_RANK

,ROW_NUMBER() OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE DESC) SCORE_ROW_NUMBER

,DENSE_RANK() OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE DESC) SCORE_DENSE_RANK

,SUM(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE DESC) SCORE_SUM

FROM (

SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88' ) T

*/

/*1 敬金鳳 1班 85 1 1 1 170

2 李永承 1班 85 1 2 1 170

3 楊正坤 1班 82 3 3 2 252

4 雷蕾 1班 79 4 4 3 331

5 高蓉蓉 1班 76 5 5 4 407*/

-- 加上IGNORE NULLS后,如果第一條是判斷的那個(gè)字段是空的,則默認(rèn)取下一條

-- FIRST_VALUE和LAST_VALUE常用在計(jì)算排過(guò)序的結(jié)果集中的最大值和最小值。

SELECT T.*

,FIRST_VALUE(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE) LOW_SCORE1

,FIRST_VALUE(T.COURSE_SCORE IGNORE NULLS) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE) LOW_SCORE2

,LAST_VALUE(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) HIGH_SCORE1

,LAST_VALUE(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE) HIGH_SCORE2

,MIN(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE) MIN_SCORE1

,MAX(T.COURSE_SCORE) OVER(PARTITION BY T.CLASS_NAME ORDER BY T.COURSE_SCORE) MAX_SCORE1

,MIN(T.COURSE_SCORE) OVER() MIN_SCORE2

,MAX(T.COURSE_SCORE) OVER() MAX_SCORE2

FROM (

SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88' ) T

/*1 高蓉蓉 1班 76 76 76 85 76 76 76 76 85

2 雷蕾 1班 79 76 76 85 79 76 79 76 85

3 楊正坤 1班 82 76 76 85 82 76 82 76 85

4 李永承 1班 85 76 76 85 85 76 85 76 85

5 敬金鳳 1班 85 76 76 85 85 76 85 76 85*/

LAG() OVER()函數(shù)用法(取出前N行數(shù)據(jù))

WITH T AS

(SELECT 1 ID ,'A' NAME FROM DUAL

UNION

SELECT 2 ID ,'B' NAME FROM DUAL

UNION

SELECT 3 ID ,'C' NAME FROM DUAL

UNION

SELECT 4 ID ,'D' NAME FROM DUAL

UNION

SELECT 5 ID ,'E' NAME FROM DUAL

)

SELECT ID,NAME,LAG(ID,1,'') OVER(ORDER BY NAME) AS LAG_ID FROM T;

/*1 A

2 B 1

3 C 2

4 D 3

5 E 4

*/

LEAD() OVER()函數(shù)用法(取出后N行數(shù)據(jù))

WITH T AS

(SELECT 1 ID,'A' NAME FROM DUAL

UNION

SELECT 2 ID,'B' NAME FROM DUAL

UNION

SELECT 3 ID,'C' NAME FROM DUAL

UNION

SELECT 4 ID,'D' NAME FROM DUAL

UNION

SELECT 5 ID,'E' NAME FROM DUAL

)

SELECT ID,NAME,LEAD(ID,1,'') OVER(ORDER BY NAME) AS LEAD_ID FROM T;

/*1 A 2

2 B 3

3 C 4

4 D 5

5 E */

計(jì)算總數(shù)百分比

-- RATIO_TO_REPORT(A)函數(shù)用法 RATIO_TO_REPORT() 括號(hào)中就是分子,OVER() 括號(hào)中就是分母

-- 計(jì)算總數(shù)百分比

WITH T AS (SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 2 A FROM DUAL

UNION ALL

SELECT 3 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 5 A FROM DUAL

)

SELECT A

, RATIO_TO_REPORT(A) OVER(PARTITION BY A) B FROM T

ORDER BY A;

/*1 1 0.333333333333333 1/3

2 1 0.333333333333333 1/3

3 1 0.333333333333333 1/3

4 2 1 1/1

5 3 1 1/1

6 4 0.5 1/2

7 4 0.5 1/2

8 5 1 1/1 */

分母缺省就是整個(gè)占比

WITH T AS (

SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 2 A FROM DUAL

UNION ALL

SELECT 3 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 5 A FROM DUAL

)

SELECT A, RATIO_TO_REPORT(A) OVER() B FROM T

ORDER BY A;

/*

1 1 0.0476190476190476 1/21

2 1 0.0476190476190476 1/21

3 1 0.0476190476190476 1/21

4 2 0.0952380952380952 2/21

5 3 0.142857142857143 3/21

6 4 0.19047619047619 4/21

7 4 0.19047619047619 4/21

8 5 0.238095238095238 5/21

21 1

*/

分組后的占比

WITH T AS (

SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 1 A FROM DUAL

UNION ALL

SELECT 2 A FROM DUAL

UNION ALL

SELECT 3 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 4 A FROM DUAL

UNION ALL

SELECT 5 A FROM DUAL

)

SELECT A, RATIO_TO_REPORT(A) OVER() B FROM T

GROUP BY A ORDER BY A;

/*

1 1 0.0666666666666667 1/15

2 2 0.133333333333333 2/15

3 3 0.2 3/15

4 4 0.266666666666667 4/15

5 5 0.333333333333333 5/15

15 1

*/

評(píng)級(jí)函數(shù)

用于等級(jí)、百分點(diǎn)、n分片等。

PERCENT_RANK 返回某個(gè)值相對(duì)于一組值的百分比排名

CUME_DIST 返回特定值對(duì)于一組值的位置“CUMULATIVE DISTRIBUTION”(累積分布)

反百分比函數(shù)

PERCENTILE_CONT 輸入一個(gè)百分比(該百分比就是按照PERCENT_RANK函數(shù)計(jì)算的值),返回該百分比位置的平均值

PERCENTILE_DISC 返回一個(gè)與輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值,分布百分比的計(jì)算方法見(jiàn)函數(shù)CUME_DIST,如果沒(méi)有正好對(duì)應(yīng)的數(shù)據(jù)值,就取大于該分布值的下一個(gè)值。

SELECT T.*

,PERCENT_RANK() OVER (PARTITION BY CLASS_NAME ORDER BY COURSE_SCORE ) PR1

,PERCENT_RANK() OVER (ORDER BY COURSE_SCORE ASC ) PR2

,CUME_DIST() OVER(PARTITION BY CLASS_NAME ORDER BY COURSE_SCORE ) PR3

,PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY COURSE_SCORE) OVER(PARTITION BY CLASS_NAME) PERCENTILE_CONT

,PERCENTILE_DISC(0.6) WITHIN GROUP(ORDER BY COURSE_SCORE) OVER(PARTITION BY CLASS_NAME) PERCENTILE_DISC

FROM (

SELECT

T1.STUDENT_NAME

,T1.CLASS_NAME

,T1.COURSE_SCORE

FROM V_RPT_COURSE_STUDENT T1

WHERE T1.EXAM_COURSE_ID = '730F9DDBD98543F2B595D3898F86AC67'

AND T1.EXAM_ID = '8793AF04C83F468A89BE12229257D65A'

AND T1.CLASS_ID = 'B3469FDB0F674523AACF1C3F2E015A88' ) T

/*1 高蓉蓉 1班 76 0 0 0.2 79 82

2 雷蕾 1班 79 0.25 0.25 0.4 79 82

3 楊正坤 1班 82 0.5 0.5 0.6 79 82

4 李永承 1班 85 0.75 0.75 1 79 82

5 敬金鳳 1班 85 0.75 0.75 1 79 82*/

序號(hào)

函數(shù)

說(shuō)明

1

RANK()

返回?cái)?shù)據(jù)項(xiàng)在分組中的排名,排名相等會(huì)在名次中留下空位

2

DENSE_RANK()

返回?cái)?shù)據(jù)項(xiàng)在分組中的排名,排名相等會(huì)在名次中不會(huì)留下空位

3

CUME_DIST()

返回特定值對(duì)于一組值的位置“cumulative distribution”(累積分布) ,累積分布,即行在組中的相對(duì)位置,返回0 ~ 1

4

PERCENT_RANK()

返回某個(gè)值相對(duì)于一組值的百分比排名,類(lèi)似CUME_DIST,1/(行的序數(shù) - 1)

5

NTILE()

返回n分片后的值

6

ROW_NUMBER()

為每條記錄返回一個(gè)數(shù)字

7

DENSE_RANK

行的相對(duì)排序(與ORDER BY搭配),相同的值具有一樣的序數(shù)(NULL計(jì)為相同),并不留空序數(shù)

8

FIRST_VALUE

一個(gè)組的第一個(gè)值

9

LAST_VALUE

一個(gè)組的最后一個(gè)值

10

LAG(expr, , )

訪問(wèn)之前的行,OFFSET是缺省為1 的正數(shù),表示相對(duì)行數(shù),DEFAULT是當(dāng)超出選定窗范圍時(shí)的返回值(如第一行不存在之前行)

11

LEAD(expr, , )

訪問(wèn)之后的行,OFFSET是缺省為1 的正數(shù),表示相對(duì)行數(shù),DEFAULT是當(dāng)超出選定窗范圍時(shí)的返回值(如最后行不存在之前行)

12

STDDEV(expr)

標(biāo)準(zhǔn)差

13

STDDEV_POP(expr)

總體標(biāo)準(zhǔn)差

14

STDDEV_SAMP(expr)

樣本標(biāo)準(zhǔn)差

15

VARIANCE(expr)

方差

16

VAR_POP(expr)

總體方差

17

VAR_SAMP(expr)

樣本方差

18

COVAR_POP(expr, expr)

總體協(xié)方差

19

COVAR_SAMP(expr, expr)

樣本協(xié)方差

20

RATIO_TO_REPORT(expr)

表達(dá)式值 / SUM(表達(dá)式值)

總結(jié)

以上是生活随笔為你收集整理的oracle 排序的分析函数,Oracle分析函数用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。