函數專題:分析函數 over____函數

來源:互聯網
上載者:User

一、sum over
sum over主要用來對某個欄位值進行逐步累加,連續求和

SELECT Name, Salary, SUM (Salary) OVER (ORDER BY Salary, Name) SubSal
FROM emp
ORDER BY Salary;

Name, Salary, Age
A,900, 20
B,900, 21
C,1000, 18
D,950, 20

執行後格式

Name, Salary, SubSal
A, 900, 900
B, 900, 1800
D, 950, 2750
C, 1000, 3750

sum(sal) over (partition by deptno) --按照不同的部門分組,對部門自身的員工工資連續求和
partition by 是起著分組的作用


二、row_number over
row_number() over ([partition by col1] order by col2) ) as 別名

表示根據col1分組,在分組內部根據 col2排序
而這個“別名”的值就表示每組內部排序後的順序編號(組內連續的唯一的),[partition by col1] 可省略

row_number() over 按照partion by 分組,然後在每組內部按照 open_date 排序 得到返回的是內部排序的順序編號

SELECT t.family_id,
t.package_id,
t.phone,
t.reason,
t.open_date,
ROW_NUMBER ()
OVER (PARTITION BY family_id, package_id, phone
ORDER BY open_date DESC)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE REASON OPEN_DATE RN
19811 100 ********861 ADC請求[校訊通-精裝版]恢複處理 2011-3-6 14:16:29 1
19811 100 ********861 ADC請求[校訊通-精裝版]暫停處理 2011-3-6 3:00:26 2
19823 100 ********667 ADC請求[精裝版]暫停處理 2011-3-12 9:47:41 1
19823 100 ********667 ADC請求[校訊通-精裝版]恢複處理 2011-3-7 19:03:30 2
19823 100 ********667 ADC請求[校訊通-精裝版]暫停處理 2011-3-7 6:51:27 3
19841 100 ********328 ADC請求[精裝版]恢複處理 2011-3-14 9:01:31 1
19841 100 ********328 ADC請求[精裝版]暫停處理 2011-3-14 0:57:33 2
19869 100 ********172 ADC請求[校訊通-精裝版]暫停處理 2011-3-5 2:55:17 1
19950 100 ********631 ADC請求[校訊通-精裝版]恢複處理 2011-3-2 14:14:51 1

SELECT t.family_id,
t.package_id,
t.phone,
t.reason,
t.open_date,
ROW_NUMBER ()
OVER (PARTITION BY family_id, package_id, phone
ORDER BY package_id DESC)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE REASON OPEN_DATE RN
19811 100 ********861 ADC請求[校訊通-精裝版]暫停處理 2011-3-6 3:00:26 1
19811 100 ********861 ADC請求[校訊通-精裝版]恢複處理 2011-3-6 14:16:29 2
19823 100 ********667 ADC請求[精裝版]暫停處理 2011-3-12 9:47:41 1
19823 100 ********667 ADC請求[校訊通-精裝版]恢複處理 2011-3-7 19:03:30 2
19823 100 ********667 ADC請求[校訊通-精裝版]暫停處理 2011-3-7 6:51:27 3
19841 100 ********328 ADC請求[精裝版]暫停處理 2011-3-14 0:57:33 1
19841 100 ********328 ADC請求[精裝版]恢複處理 2011-3-14 9:01:31 2
19869 100 ********172 ADC請求[校訊通-精裝版]暫停處理 2011-3-5 2:55:17 1
19950 100 ********631 ADC請求[校訊通-精裝版]恢複處理 2011-3-2 14:14:51 1


三、count over

SELECT t.family_id,
t.package_id,
t.phone,
t.open_date,
t.reason,
COUNT( * )
OVER (PARTITION BY family_id, package_id, phone)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE OPEN_DATE REASON RN
19811 100 ********861 2011-3-6 3:00:26 ADC請求[校訊通-精裝版]暫停處理 2
19811 100 ********861 2011-3-6 14:16:29 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-12 9:47:41 ADC請求[精裝版]暫停處理 3
19823 100 ********667 2011-3-7 19:03:30 ADC請求[校訊通-精裝版]恢複處理 3
19823 100 ********667 2011-3-7 6:51:27 ADC請求[校訊通-精裝版]暫停處理 3
19841 100 ********328 2011-3-14 0:57:33 ADC請求[精裝版]暫停處理 2
19841 100 ********328 2011-3-14 9:01:31 ADC請求[精裝版]恢複處理 2
19869 100 ********172 2011-3-5 2:55:17 ADC請求[校訊通-精裝版]暫停處理 1
19950 100 ********631 2011-3-2 14:14:51 ADC請求[校訊通-精裝版]恢複處理 1

SELECT t.family_id,
t.package_id,
t.phone,
t.open_date,
t.reason,
COUNT( * )
OVER (PARTITION BY family_id, package_id, phone
order by open_date)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE OPEN_DATE REASON RN
19811 100 ********861 2011-3-6 3:00:26 ADC請求[校訊通-精裝版]暫停處理 1
19811 100 ********861 2011-3-6 14:16:29 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-7 6:51:27 ADC請求[校訊通-精裝版]暫停處理 1
19823 100 ********667 2011-3-7 19:03:30 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-12 9:47:41 ADC請求[精裝版]暫停處理 3
19841 100 ********328 2011-3-14 0:57:33 ADC請求[精裝版]暫停處理 1
19841 100 ********328 2011-3-14 9:01:31 ADC請求[精裝版]恢複處理 2
19869 100 ********172 2011-3-5 2:55:17 ADC請求[校訊通-精裝版]暫停處理 1
19950 100 ********631 2011-3-2 14:14:51 ADC請求[校訊通-精裝版]恢複處理 1

SELECT t.family_id,
t.package_id,
t.phone,
t.open_date,
t.reason,
COUNT( * )
OVER (PARTITION BY family_id, package_id, phone
order by package_id)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE OPEN_DATE REASON RN
19811 100 ********861 2011-3-6 3:00:26 ADC請求[校訊通-精裝版]暫停處理 2
19811 100 ********861 2011-3-6 14:16:29 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-12 9:47:41 ADC請求[精裝版]暫停處理 3
19823 100 ********667 2011-3-7 19:03:30 ADC請求[校訊通-精裝版]恢複處理 3
19823 100 ********667 2011-3-7 6:51:27 ADC請求[校訊通-精裝版]暫停處理 3
19841 100 ********328 2011-3-14 0:57:33 ADC請求[精裝版]暫停處理 2
19841 100 ********328 2011-3-14 9:01:31 ADC請求[精裝版]恢複處理 2
19869 100 ********172 2011-3-5 2:55:17 ADC請求[校訊通-精裝版]暫停處理 1
19950 100 ********631 2011-3-2 14:14:51 ADC請求[校訊通-精裝版]恢複處理 1

SELECT t.family_id,
t.package_id,
t.phone,
t.reason,
COUNT( * )
OVER (PARTITION BY family_id, package_id, phone
ORDER BY open_date DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE OPEN_DATE REASON RN
19811 100 ********861 2011-3-6 3:00:26 ADC請求[校訊通-精裝版]暫停處理 1
19811 100 ********861 2011-3-6 14:16:29 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-7 6:51:27 ADC請求[校訊通-精裝版]暫停處理 1
19823 100 ********667 2011-3-7 19:03:30 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 2011-3-12 9:47:41 ADC請求[精裝版]暫停處理 3
19841 100 ********328 2011-3-14 0:57:33 ADC請求[精裝版]暫停處理 1
19841 100 ********328 2011-3-14 9:01:31 ADC請求[精裝版]恢複處理 2
19869 100 ********172 2011-3-5 2:55:17 ADC請求[校訊通-精裝版]暫停處理 1
19950 100 ********631 2011-3-2 14:14:51 ADC請求[校訊通-精裝版]恢複處理 1

SELECT t.family_id,
t.package_id,
t.phone,
t.reason,
COUNT( * )
OVER (PARTITION BY family_id, package_id, phone
ORDER BY package_id DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
rn
FROM zj_transaction_log t
WHERE TO_CHAR (t.open_date, 'yyyy-mm') >= '2011-03';

FAMILY_ID PACKAGE_ID PHONE REASON RN
19811 100 ********861 ADC請求[校訊通-精裝版]暫停處理 1
19811 100 ********861 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 ADC請求[精裝版]暫停處理 1
19823 100 ********667 ADC請求[校訊通-精裝版]恢複處理 2
19823 100 ********667 ADC請求[校訊通-精裝版]暫停處理 3
19841 100 ********328 ADC請求[精裝版]暫停處理 1
19841 100 ********328 ADC請求[精裝版]恢複處理 2
19869 100 ********172 ADC請求[校訊通-精裝版]暫停處理 1
19950 100 ********631 ADC請求[校訊通-精裝版]恢複處理 1


四、rank\dense_rank over

rank 的分析功能文法:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )

rank 的合計功能文法:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)

對於分析功能,
SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;
已col2分組col1排序,rank與dense_rank用法相當,區別如下:
  
例如:當rank時為:
SELECT f.phone, f.student_name,
RANK () OVER (PARTITION BY f.phone ORDER BY f.student_name) cnt
FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
AND LENGTH (f.phone) = 11
AND f.phone NOT LIKE '%0%'
  
PHONE STUDENT_NAME CNT
********188 陳雅琳 1
********188 陳雅琳 1
********188 陳鎮豪 3

而如果用dense_rank時為:
SELECT f.phone, f.student_name,
dense_RANK () OVER (PARTITION BY f.phone ORDER BY f.student_name) cnt
FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
AND LENGTH (f.phone) = 11
AND f.phone NOT LIKE '%0%'
  
PHONE STUDENT_NAME CNT
********188 陳雅琳 1
********188 陳雅琳 1
********188 陳鎮豪 2

從上可知,都是對資料分組排序,差別在於以a分組,b排序的時候,dence_rank在並列關係時,相關等級不會跳過。rank則跳過(常用在排名)。

over 分析函數系列都十分類似。

對於合計功能:

SELECT RANK ('********188','陳雅琳') within group (ORDER BY f.phone,f.student_name) cnt
FROM zs_family f
WHERE NVL (f.is_test, 0) <> 1
AND LENGTH (f.phone) = 11
AND f.phone NOT LIKE '%0%';

cnt
258

感覺就是查詢定位該記錄的在表中位置


五、max\min over
功能:產生2列獲得欄位最大值、最小值
例如:
查詢員工資訊與其中工資最高最低員工 select ename,sal,max(sal) over(), min(sal) over() from emp;


六、lag\lead over
功能:
得到當前行上一行或者下一行的資料
例子:
要求用一個SQL語句,統計每個月及上月和下月的訂單量
要求列表輸出為
月份 當月訂單量 上月訂單量 下月訂單量
select to_char(d.update_time, 'yyyymm'),
count(code),
lag(count(code)) over(order by count(code)) 上月訂單量,
lead(count(code)) over(order by count(code)) 下有訂單量
from V_NWRZ_dwxx_TEST2 d
group by to_char(d.update_time, 'yyyymm');



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.