一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - PostgreSQL - PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用

PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用

2020-05-03 16:19張志敏 PostgreSQL

這PostgreSQL中提供了窗口函數(shù),一個(gè)窗口函數(shù)在一系列與當(dāng)前行有某種關(guān)聯(lián)的表行上進(jìn)行一種計(jì)算。下面這篇文章主要給大家介紹了關(guān)于PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用的相關(guān)資料,需要的朋友可以參考下

什么是窗口函數(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)前行。

  • 可以訪問與當(dāng)前記錄相關(guān)的多行記錄;
  • 不會(huì)使多行聚集成一行, 與聚集函數(shù)的區(qū)別;

窗口函數(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ù), 對全部數(shù)據(jù)進(jìn)行計(jì)算。

PARTITION BY 子句將查詢的行分組成為分區(qū), 窗口函數(shù)會(huì)獨(dú)立地處理它們。PARTITION BY 工作起來類似于一個(gè)查詢級別的 GROUP BY 子句, 不過它的表達(dá)式總是只是表達(dá)式并且不能是輸出列的名稱或編號。 如果沒有 PARTITION BY, 該查詢產(chǎn)生的所有行被當(dāng)作一個(gè)單一分區(qū)來處理。

ORDER BY 子句決定被窗口函數(shù)處理的一個(gè)分區(qū)中的行的順序。 它工作起來類似于一個(gè)查詢級別的 ORDER BY 子句, 但是同樣不能使用輸出列的名稱或編號。 如果沒有 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)如下:

?
1
2
3
SELECT emp_no, dep_name, salary
FROM public.emp_salary
order by dep_name, emp_no;

 

emp_id

dep_name

salary

7

develop

4200

8

develop

6000

9

develop

4500

10

develop

5200

11

develop

5200

2

personnel

3900

5

personnel

3500

1

sales

5000

3

sales

4800

4

sales

4800

 

如果要將每位員工與其部門的平均工資進(jìn)行對比, 需要這樣的結(jié)果:

 

emp_id

dep_name

salary

avg

7

develop

4200

5020

8

develop

6000

5020

9

develop

4500

5020

10

develop

5200

5020

11

develop

5200

5020

2

personnel

3900

3700

5

personnel

3500

3700

1

sales

5000

4866.66666666667

3

sales

4800

4866.66666666667

4

sales

4800

4866.66666666667

 

如果不用窗口函數(shù)來查詢, 則比較復(fù)雜, 當(dāng)然也能做到, 語句如下:

?
1
2
3
4
5
6
7
8
SELECT e0.emp_no, e0.dep_name, e0.salary, e2.avg_salary
FROM public.emp_salary e0
join (
 select e1.dep_name, avg(e1.salary) as avg_salary
 from public.emp_salary e1
 group by e1.dep_name
) e2 on e2.dep_name = e0.dep_name
order by e0.dep_name, e0.emp_no;

如果使用窗口函數(shù)進(jìn)行查詢, 則很容易做到, sql 語句如下:

?
1
2
3
4
SELECT emp_no, dep_name, salary,
  avg(salary) over(partition by dep_name)
FROM public.emp_salary
order by dep_name, emp_no;

但是如果要查詢隨著員工的增加, 各部門平均工資的變化, 如下表所示的結(jié)果, 不用窗口函數(shù)查詢的話就很難做到了。

 

emp_id

dep_name

salary

avg

7

develop

4200

4200

8

develop

6000

5100

9

develop

4500

4900

10

develop

5200

4975

11

develop

5200

5020

2

personnel

3900

3900

5

personnel

3500

3700

1

sales

5000

5000

3

sales

4800

4900

4

sales

4800

4866.66666666667

 

如果使用窗口函數(shù), 依然可以輕松完成, 語句如下:

?
1
2
3
4
SELECT emp_no, dep_name, salary,
  avg(salary) over(partition by dep_name order by emp_no)
FROM public.emp_salary
order by dep_name, emp_no;

可見, 窗口函數(shù)在需要對查詢結(jié)果中的相關(guān)行進(jìn)行計(jì)算時(shí)有很大的優(yōu)勢。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://beginor.github.io/2019/03/23/window-functions-in-postgresql.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 777奇米影视一区二区三区 | 男人添女人 | 亚洲精品91 | 美女被躁爽死 | 日韩成人影视 | 久久精品热在线观看85 | 国产男女爱视频在线观看 | 国产做a爰片久久毛片 | 午夜DV内射一区区 | 免费久久久久 | 美女扒开奶罩让男人吃奶 | 成人免费一区二区三区在线观看 | 1313午夜精品久久午夜片 | 男人操美女逼视频 | 性欧美13处丶14处 | 黑白配高清hd在线视频 | 校草让我脱了内裤给全班看 | 五月天精品在线 | 日韩精品欧美 | 国产精品国产精品国产三级普 | 女人全身裸露无遮挡免费观看 | 日韩欧美成末人一区二区三区 | 亚洲第五色综合网啪啪 | 天天草天天 | 国内自拍网红在线自拍综合 | 涩涩屋在线观看 | 国产欧美日韩成人 | 九九热视频 这里有精品 | 女王调奴丨vk | 精品国产一区二区三区久 | 国产网站视频 | 我与旗袍老师疯狂床震 | 91视频国产一区 | www.日本在线播放 | 欧美一级欧美一级高清 | 十六以下岁女子毛片免费 | 久草在线福利视频在线播放 | 精新精新国产自在现 | 亚洲成av人在线视 | 福利视频一区青娱 | julia ann一hd|