国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - PostgreSQL - PostgreSQL數據庫中窗口函數的語法與使用

PostgreSQL數據庫中窗口函數的語法與使用

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

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

什么是窗口函數?

一個窗口函數在一系列與當前行有某種關聯的表行上執行一種計算。這與一個聚集函數所完成的計算有可比之處。但是窗口函數并不會使多行被聚集成一個單獨的輸出行,這與通常的非窗口聚集函數不同。取而代之,行保留它們獨立的標識。在這些現象背后,窗口函數可以訪問的不僅僅是查詢結果的當前行。

  • 可以訪問與當前記錄相關的多行記錄;
  • 不會使多行聚集成一行, 與聚集函數的區別;

窗口函數語法

窗口函數跟隨一個 OVER 子句, OVER 子句決定究竟查詢中的哪些行被分離出來由窗口函數處理。

可以包含分區 (PARTITION BY) 和排序 (ORDER BY) 指令, 這二者都是可選的。

window_func() OVER([PARTITION BY field] [ORDER BY field])

如果沒有指定 PARTITION BY 和 ORDER BY 指令, 則等同于聚合函數, 對全部數據進行計算。

PARTITION BY 子句將查詢的行分組成為分區, 窗口函數會獨立地處理它們。PARTITION BY 工作起來類似于一個查詢級別的 GROUP BY 子句, 不過它的表達式總是只是表達式并且不能是輸出列的名稱或編號。 如果沒有 PARTITION BY, 該查詢產生的所有行被當作一個單一分區來處理。

ORDER BY 子句決定被窗口函數處理的一個分區中的行的順序。 它工作起來類似于一個查詢級別的 ORDER BY 子句, 但是同樣不能使用輸出列的名稱或編號。 如果沒有 ORDER BY, 行將被以未指定的順序被處理。

PostgreSQL 中的聚合函數也可以作為窗口函數來使用

除了這些內置的窗口函數外,任何內建的或用戶定義的通用或統計聚集(也就是有序集或假想集聚集除外)都可以作為窗口函數。僅當調用跟著OVER子句時,聚集函數才會作為窗口函數;否則它們作為非窗口的聚集并為剩余的集合返回單行。

窗口函數示例

員工工資 (emp_salary) 表結構如下:

?
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

 

如果要將每位員工與其部門的平均工資進行對比, 需要這樣的結果:

 

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

 

如果不用窗口函數來查詢, 則比較復雜, 當然也能做到, 語句如下:

?
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;

如果使用窗口函數進行查詢, 則很容易做到, 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;

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

 

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

 

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

?
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;

可見, 窗口函數在需要對查詢結果中的相關行進行計算時有很大的優勢。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品视频 | 免费精品人在线二线三线区别 | 亚洲成av人片在线观看无码 | 国产日韩高清在线 | 色综合久久久久久久久久久 | 毛片免费播放 | 亚洲精品视| 自拍偷拍专区 | 精品少妇一区二区三区日产乱码 | 亚洲视频区 | 日韩欧美~中文字幕 | 精品久久久蜜桃 | 成人a级片在线观看 | 99免费视频 | 国产日韩欧美在线观看 | 日本成人片网站 | 成人午夜精品 | av在线日韩 | 九色在线观看 | av免费网站在线观看 | 在线精品一区 | 国产成人在线视频 | 亚洲精品自拍 | 狠狠色狠色综合曰曰 | 久久久免费视频播放 | 久久久综合网 | 一区二区高清 | 久久久久久91香蕉国产 | 免费色在线 | 97精品久久| 午夜在线| 黄色小视频国产 | 精品国产视频 | 噜噜噜在线观看免费视频日本 | 国产一区二区三区欧美 | 丝袜久久 | 中文字幕亚洲欧美日韩在线不卡 | 中文字幕在线三区 | 黄色电影天堂 | 色综合社区 | 91av电影网 |