時(shí)間:2024-02-09 10:40作者:下載吧人氣:30
什么是窗口函數(shù)?
一個(gè)窗口函數(shù)在一系列與當(dāng)前行有某種關(guān)聯(lián)的表行上執(zhí)行一種計(jì)算。這與一個(gè)聚集函數(shù)所完成的計(jì)算有可比之處。但是窗口函數(shù)并不會(huì)使多行被聚集成一個(gè)單獨(dú)的輸出行,這與通常的非窗口聚集函數(shù)不同。取而代之,行保留它們獨(dú)立的標(biāo)識(shí)。在這些現(xiàn)象背后,窗口函數(shù)可以訪問的不僅僅是查詢結(jié)果的當(dāng)前行。
窗口函數(shù)語法
窗口函數(shù)跟隨一個(gè) OVER 子句, OVER 子句決定究竟查詢中的哪些行被分離出來由窗口函數(shù)處理。
可以包含分區(qū) (PARTITION BY) 和排序 (ORDER BY) 指令, 這二者都是可選的。
window_func() OVER([PARTITION BY field] [ORDER BY field])
如果沒有指定 PARTITION BY 和 ORDER BY 指令, 則等同于聚合函數(shù), 對(duì)全部數(shù)據(jù)進(jìn)行計(jì)算。
PARTITION BY 子句將查詢的行分組成為分區(qū), 窗口函數(shù)會(huì)獨(dú)立地處理它們。PARTITION BY 工作起來類似于一個(gè)查詢級(jí)別的 GROUP BY 子句, 不過它的表達(dá)式總是只是表達(dá)式并且不能是輸出列的名稱或編號(hào)。 如果沒有 PARTITION BY, 該查詢產(chǎn)生的所有行被當(dāng)作一個(gè)單一分區(qū)來處理。
ORDER BY 子句決定被窗口函數(shù)處理的一個(gè)分區(qū)中的行的順序。 它工作起來類似于一個(gè)查詢級(jí)別的 ORDER BY 子句, 但是同樣不能使用輸出列的名稱或編號(hào)。 如果沒有 ORDER BY, 行將被以未指定的順序被處理。
PostgreSQL 中的聚合函數(shù)也可以作為窗口函數(shù)來使用
除了這些內(nèi)置的窗口函數(shù)外,任何內(nèi)建的或用戶定義的通用或統(tǒng)計(jì)聚集(也就是有序集或假想集聚集除外)都可以作為窗口函數(shù)。僅當(dāng)調(diào)用跟著OVER子句時(shí),聚集函數(shù)才會(huì)作為窗口函數(shù);否則它們作為非窗口的聚集并為剩余的集合返回單行。
窗口函數(shù)示例
員工工資 (emp_salary) 表結(jié)構(gòu)如下:
SELECT emp_no, dep_name, salary
FROM public.emp_salary
order by dep_name, emp_no;
網(wǎng)友評(píng)論