窗口函數(shù)與聚合函數(shù)的區(qū)別
聚合函數(shù)通常只返回聚合的結(jié)果以及聚合的關(guān)鍵字段,如果需要返回聚合的列以外的列的值,那么就需要用到開窗函數(shù)。與聚合函數(shù)不同的是,開窗函數(shù)會(huì)將聚合的結(jié)果合并到原本的結(jié)果集中
使用場(chǎng)景:例如 一個(gè)表Table1中存在 列 KEY,VALUE,DATE
| KEY(學(xué)生) | VALUE (成績(jī)) | DATE(日期) |
|---|---|---|
| 張三 | 89 | 2021/01/02 |
| 張三 | 72 | 2021/11/12 |
| 李四 | 63 | 2021/10/12 |
| 李四 | 91 | 2021/11/14 |
某個(gè)業(yè)務(wù)需要根據(jù)學(xué)生匯總,去除重復(fù)項(xiàng),只取最新日期的成績(jī)
Group BY語句:
SELECT A.KEY,A.VALUE,A.DATE FROM TABLE1 A
(SELECT MAX(DATE),KEY FROM TABLE1 GROUP BY KEY) B
WHERE A.KEY = B.KEY AND A.DATE = B.DATE
GROUP BY結(jié)果:
| KEY(學(xué)生) | VALUE (成績(jī)) | DATE(日期) |
|---|---|---|
| 張三 | 72 | 2021/11/12 |
| 李四 | 91 | 2021/11/14 |
使用開窗函數(shù)FIRST_VALUE取按KEY聚合后,ORDER 排序的第一項(xiàng)
FIRST_VALUE(A.VALUE)OVER( PARTITION BY A.KEY ORDER BY A.DATE DESC)
SELECT KEY,FIRST_VALUE(A.VALUE)OVER(
PARTITION BY A.KEY ORDER BY A.DATE DESC) AS NVALUE,VALUE,DATE FROM TABLE1 A
開窗函數(shù)結(jié)果
| KEY(學(xué)生) | VALUE (成績(jī)) | NVALUE(最新成績(jī)) | DATE(日期) |
|---|---|---|---|
| 張三 | 89 | 72 | 2021/01/02 |
| 張三 | 72 | 72 | 2021/11/12 |
| 李四 | 63 | 91 | 2021/10/12 |
| 李四 | 91 | 91 | 2021/11/14 |
再去除重復(fù)項(xiàng),使用ROW_NUMBER(),將同一類數(shù)據(jù)記錄,再通過篩選取出最新項(xiàng)
ROW_NUMBER() OVER( PARTITION BY A.KEY ORDER BY A.DATE DESC)
SELECT * FROM (SELECT KEY,FIRST_VALUE(A.VALUE)OVER(
PARTITION BY A.KEY ORDER BY A.DATE DESC) AS NVALUE,ROW_NUMBER() OVER(
PARTITION BY A.KEY ORDER BY A.DATE DESC) AS
RWORDER ,VALUE,DATE FROM TABLE1 A) WHERE RWORDER =1
最終結(jié)果
| KEY(學(xué)生) | VALUE (成績(jī)) | NVALUE(最新成績(jī)) | DATE(日期) | MM |
|---|---|---|---|---|
| 張三 | 72 | 72 | 2021/11/12 | 1 |
| 李四 | 91 | 91 | 2021/11/14 | 1 |
https://blog.csdn.net/qq_41708308/article/details/89374701
https://blog.csdn.net/qq_37816503/article/details/108408875