精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SQL窗口函數原理和使用

數據庫 其他數據庫
相信你對 SQL 窗口函數已經有了一個整體和直觀的認識,對其中的使用細節也有了一定的理解,特別是對分區、滑動窗口、range 和 rows 模式下滑動窗口的邊界,以及操作函數的作用范圍和使用方式有了一個清楚的認知。

今天我們來聊聊 SQL 窗口函數。你是不是經常對復雜的報表查詢感到比較頭疼?在網上找到了一些窗口函數的 demo,但因為對實現原理一知半解,經常導致寫的 SQL 查詢的數據口徑對不上。如果你有這樣的問題,就靜下心來好好學習一下這一講的內容。我會給你詳細地介紹 SQL 窗口函數的原理和使用方法,幫你找到解決問題的方案。

SQL 窗口函數介紹

首先,我們先對 SQL 窗口函數的使用場景、所處的執行階段以及它的原理做一個簡單的了解。

  1. SQL 窗口函數的使用場景:窗口函數只能在 select 查詢列表中使用,不能用于 update 和 delete 語句。窗口函數不影響查詢記錄的數量,它的作用僅僅是在 select 列表里面新增一個列而已,且多個窗口函數之間互不影響。
  2. SQL 窗口函數所處的執行階段:它只能出現在 select 列表中,晚于 from、where、group by、having 的執行。早于 order by、limit、select distinct 的執行。
  3. SQL 窗口函數的原理:窗口函數顧名思義,就是將 SQL 查詢出來的結果看成一個大窗口。可以對整個窗口進行分區(partition by), 每個分區包含一個滑動窗口(frame)。

圖片圖片

over() 函數

在我們的 SQL 中通過調用 over() 函數,我們可以生成一個窗口(基于 SQL 查詢的全部結果)。over 函數內部支持如下參數:

  • partition by <分區列名>;
  • order by <列名 [asc|desc] ,用于指定分區內的數據的排列先后順序>;
  • <range|rows> between <滑動窗口的上邊界> and <滑動窗口的下邊界> 用于指定滑動窗口的大小。

語法解釋

  • 當 over 函數內的參數為空時,整個結果集就是一個分區(不指定 partition by)。滑動窗口的大小也是整個結果集。
  • 當 order by 不指定的時候,記錄行(rows)使用默認的順序,也就是從數據庫查詢出來的順序。因為窗口函數在 order by 語句之前執行,所以順序只能是默認的順序。在此我強烈建議窗口函數都帶上 order by 從句,否則結果列可能會是不確定的值。MySQL 可以支持不帶 order by,但在 Oracle 和 SQL Server 上,指定滑動窗口時,必須帶上 order by,否則就會報錯。
  • 當沒有指定滑動窗口大小的參數時,即沒有指定 range 或者 rows 從句,滑動窗口的默認大小為:上邊界=分區的第一條記錄,下邊界=當前記錄。

滑動窗口(Frame)語法講解

滑動窗口是基于當前行的,它有一個上邊界和一個下邊界,滑動窗口不能脫離 partition 獨立存在。當指定了 partition by 和 order by,而不指定滑動窗口時,滑動窗口默認的上邊界為 partition 內第一條記錄,下邊界為當前記錄。每一行記錄都有一個滑動窗口。

指定滑動窗口的時候,必須是已經有了 partition by 從句,否則 SQL 會報錯。雖然 MySQL8 支持,但是不建議你這樣使用。當 over 函數里面沒有 partition by 從句和滑動窗口從句時,默認的滑動窗口就是整個結果集。

滑動窗口大小支持兩種模式,range 模式和 rows 模式。

  • rows 模式
    rows between N preceding and M following

滑動窗口的構成以當前邏輯行為基準點,向上指定 N 行 (邏輯行) 為上邊界,向下指定 M 行 (邏輯行) 為下邊界。

  • range 模式(注意:range 模式必須指定 order by 從句)
    range between N preceding and M following

滑動窗口的構成以當前邏輯行為基準點,值是 order by 從句中使用的列的值。

上邊界:當前邏輯行之前 值 >= 當前邏輯行的值 - N 的所有邏輯行

下邊界:當前邏輯行之后 值 <= 當前邏輯行的值 + M 的所有邏輯行

邊界常量

  • unbounded preceding:表示分區內第一條記錄 (邏輯行),不管是否指定 order by 從句。
  • unbounded following:表示分區內最后一條記錄 (邏輯行),不管是否指定 order by 從句。
  • current row:字面意思是當前行,在 rows 模式下,表示當前邏輯行。在 range 模式下,表示在當前邏輯行前后,值和當前邏輯行的值相等的所有邏輯行 (range 模式下指定了 order by,值都是有序的)。
  • N preceding 和 N following:參考 range 和 rows 模式里面的解釋,分別表示往前 N 行的數據和往后 N 行的數據。

操作函數

當 over 函數指定了窗口之后,需要操作函數對分區內(partition)或者滑動窗口內(Frame)的數據進行操作。

窗口函數分為 聚合函數和 非聚合函數。聚合函數處理數據大部分都是基于滑動窗口的。非聚合函數處理數據有基于滑動窗口的,也有基于分區的。下表是常用的操作函數,另外不同的數據庫還會實現自身特有的操作函數。

圖片表 1  常用的操作函數介紹

關于操作函數的詳細描述和具體的使用方式,感興趣的話你可以參考鏈接中的內容:

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

示例

接下來我們通過示例表 names,來具體操作一下。這是示例的數據。

圖 2  示例數據圖 2 示例數據

  • row_number 函數
    按照 name 列分區,為每一行記錄生成行號,行號按照 val 列的值倒序生成。
select name,val,
row_number() over(partition by name order by val desc) num
from names
  • dense_rank 函數
    按照 name 列分區,為每一行記錄按照 val 列的值倒序生成排名。排名不能有間隔。
select name,val,
dense_rank() over(partition by name order by val desc) rnk
from names
  • rank 函數
    按照 name 列分區,為每一行記錄按照 val 列的值倒序生成排名。排名允許有間隔。
select name,val,
rank() over(partition by name order by val desc) rnk
from names
  • lag 函數
    按照 name 列分區,為每一行記錄生成 val 列和它前面一條記錄的差值,前面的記錄不存在用 0 表示。
select name,val,
val - lag(val,1,0) over(partition by name order by val desc) diff
from names

其中 lag(val,1,0) 表示,獲取當前行前面 1 行的 val 字段的值,如果前面一行不存在,用 0 表示默認值。

  • first_value 函數
    按照 name 列分區,為每一行記錄生成 val 列和他所在滑動窗口內,第一條記錄 val 列表的差值,按照 val 的值倒序排列。
select name,val,
val - first_value(val) over(partition by name order by val desc) diff
from names
  • 混合使用
select name,val,
row_number() over(partitionbynameorderby val desc) num,
val - first_value(val) over(partitionbynameorderby val desc) diff,
dense_rank() over(partitionbynameorderby val desc) rnk
fromnames

因為每個窗口函數都是獨立的,互不影響,可以在 select 列表里面使用多個窗口函數生成多列,各個列也互不影響。

總結

圖片圖片

通過學習,相信你對 SQL 窗口函數已經有了一個整體和直觀的認識,對其中的使用細節也有了一定的理解,特別是對分區、滑動窗口、range 和 rows 模式下滑動窗口的邊界,以及操作函數的作用范圍和使用方式有了一個清楚的認知。但想要牢固地掌握這些知識,還需要你學以致用,多多練習。

責任編輯:武曉燕 來源: 程序員技術充電站
相關推薦

2023-11-09 14:47:51

SQL工具數據庫

2010-09-09 09:31:19

SQL函數left

2010-09-10 13:56:25

SQLMAX()函數

2021-04-16 10:45:02

SQLJava函數

2024-03-05 15:28:38

SQL窗口函數分頁查詢

2022-02-06 11:35:53

SQL數據函數

2010-09-24 19:28:12

SQL CHARIND

2021-01-07 16:50:36

SQL數據庫函數

2021-01-06 10:33:15

SQL數據庫函數

2010-09-08 13:40:15

SQL函數DateDiff

2010-09-06 16:40:52

SQL函數

2010-09-24 19:02:40

SQL中CONVERT

2023-11-10 16:28:02

TCP窗口

2010-10-25 17:33:35

Oracle數學函數

2024-06-27 08:26:10

LooperAndroid內存

2020-09-28 15:00:19

Linux容器虛擬化

2010-09-06 17:11:14

SQL函數

2023-08-11 07:44:40

TCP滑動窗口數據

2010-09-09 09:49:18

SQL函數存儲過程

2021-12-15 19:22:38

原理View動畫
點贊
收藏

51CTO技術棧公眾號

精品国产一区二区三区麻豆小说| 色综合久综合久久综合久鬼88| 久久综合久久色| 国产免费永久在线观看| 久久av资源网| 隔壁老王国产在线精品| 欧洲美熟女乱又伦| 99a精品视频在线观看| 色婷婷国产精品| 成人性做爰片免费视频| 五月激情丁香婷婷| 另类综合日韩欧美亚洲| 午夜精品久久17c| 一本色道久久88| 青青视频一区二区| 51精品秘密在线观看| 欧美亚洲另类色图| h片在线观看网站| 国产农村妇女精品| 国产精品美女诱惑| 国产尤物在线观看| 久久国产欧美| 97福利一区二区| 污污视频网站在线免费观看| 久久久久久毛片免费看 | 日韩精品一区二区三区av| 一区二区三区在线观看动漫| 色综合666| 日韩在线视频观看免费| 国产一区二区久久| 国产精品久久久久久久av大片| 久久久久久久久久久久久久免费看 | 伊人在我在线看导航| 国产亚洲欧美日韩俺去了| 国产伦精品一区二区三区四区免费| 91成人国产综合久久精品| 亚洲欧美日韩国产| 久久久亚洲影院你懂的| 日韩一区二区不卡视频| 日韩伦理一区| 亚洲区一区二区| 国产精品无码一区二区三| 亚洲高清在线一区| 欧美一级在线免费| 亚洲欧美手机在线| 78精品国产综合久久香蕉| 日韩欧美在线播放| 欧美 日韩 国产在线观看| 午夜伦理在线视频| 一区在线播放视频| 亚洲国产一区二区精品视频| 成人午夜电影在线观看| 久久男人中文字幕资源站| 精品国产福利| 人妻无码中文字幕| www.一区二区| 麻豆久久久9性大片| 天天射天天色天天干| 成人av网在线| 精品人伦一区二区三区 | 一区二区三区亚洲| 在线不卡av电影| 精品视频黄色| 精品国内自产拍在线观看| 任我爽在线视频| 亚洲成人国产| 欧美黄色成人网| 国产无遮挡又黄又爽又色| 亚洲国产专区校园欧美| 久久躁狠狠躁夜夜爽| 印度午夜性春猛xxx交| 欧美黄色精品| 午夜精品理论片| 999视频在线| 美女看a上一区| 91香蕉电影院| 内射后入在线观看一区| 97久久精品人人爽人人爽蜜臀| 蜜桃传媒视频第一区入口在线看| 国产区在线视频| 成人免费在线播放视频| 国产免费内射又粗又爽密桃视频| 大香伊人久久| 色婷婷综合久久久中文字幕| 免费成年人高清视频| 亚洲国产欧美国产第一区| 亚洲国产成人一区| 国产一二三四五区| 91精品国产乱码久久久久久久| 欧美丰满少妇xxxxx做受| 国产精品一区二区6| 日韩福利电影在线观看| 2022国产精品| 日本午夜在线| 亚洲美女免费视频| 免费无码av片在线观看| 小说区图片区亚洲| 亚洲国产精品va在线| 国精产品一区一区| 国语自产精品视频在线看8查询8| 国产第一区电影| 精品人妻av一区二区三区| 91热门视频在线观看| 一本久久a久久精品vr综合| xxxx另类黑人| 欧美日高清视频| 中文字幕在线永久| 日韩av不卡一区| 色婷婷成人综合| 欧美福利视频一区二区| 国产一区二区三区四区在线观看| 麻豆av福利av久久av| 在线黄色网页| 午夜精品久久久久久久蜜桃app| 三级av免费观看| 青青视频一区二区| 欧美激情按摩在线| 一本一道精品欧美中文字幕| 2欧美一区二区三区在线观看视频| 亚洲欧美日韩不卡| 你懂得影院夜精品a| 亚洲福利在线视频| 国产精品 欧美激情| 日韩精品电影在线| 成人午夜电影免费在线观看| 免费成人黄色| 欧美中文字幕一区二区三区亚洲| 熟妇高潮一区二区| 欧美高清日韩| 成人有码在线播放| 在线观看麻豆| 欧美在线视频全部完| 国产肉体xxxx裸体784大胆| 中文字幕人成人乱码| 国产精品日韩在线| 国产小视频福利在线| 欧美日韩免费区域视频在线观看| 乱码一区二区三区| 综合激情一区| 亚洲综合自拍一区| 伊人春色在线观看| 欧美一区二区在线免费观看| 亚洲综合久久av一区二区三区| 日韩精品一级二级| 日韩精品欧美在线| 电影亚洲精品噜噜在线观看| 亚洲欧洲在线看| 日本免费在线观看视频| 久久久久久久久久久久久女国产乱| 青青草视频在线免费播放| 国产成人精品亚洲线观看| 欧美精品videossex88| 亚洲第一天堂在线观看| 亚洲综合一区二区精品导航| 国产乱淫av麻豆国产免费| 欧美日韩三级电影在线| 高清不卡一区二区三区| 1区2区3区在线| 亚洲精品久久久久| 国产精品第5页| 国产校园另类小说区| 日本www.色| 欧美r级电影| 91精品免费视频| 中文字幕在线观看播放| 日韩无一区二区| 国产精品111| 久久综合中文字幕| 日日噜噜噜噜久久久精品毛片| 色欧美自拍视频| 成人伊人精品色xxxx视频| 青春草在线免费视频| 亚洲高清av在线| 无码一区二区三区在线观看| 久久精品免视看| 亚洲图色中文字幕| 亚洲第一精品影视| 欧美午夜精品理论片a级大开眼界| 日本精品另类| 精品综合久久久久久97| 天天干天天舔天天射| 欧美性大战久久久久久久| 成人观看免费视频| 91美女视频网站| 色啦啦av综合| 亚洲国产免费看| 亚洲国产欧洲综合997久久 | 久久99久久99精品蜜柚传媒| 日本.亚洲电影| 欧美另类xxx| 国产三区四区在线观看| 日韩欧美专区在线| 一级片免费在线播放| 亚洲欧洲精品天堂一级| 国产激情视频网站| 黄色精品一二区| 91精品91久久久中77777老牛| 青青草97国产精品麻豆| 成人动漫视频在线观看免费| 日本少妇一区| 欧美国产激情18| 国产在线视频网| 精品奇米国产一区二区三区| 欧美性受xxx黑人xyx性爽| 一区二区三区在线免费观看 | 国产精品国产精品国产专区不蜜| avtt中文字幕| 精品一区二区三区在线观看国产| 国产69精品久久久久久久| 91久久久精品国产| 欧美不卡福利| 国产精品宾馆| 91免费福利视频| 成人全视频在线观看在线播放高清 | 91精品国产综合久久久久久漫画 | 91麻豆精品国产91久久久久| 99热只有这里有精品| 自拍偷拍国产亚洲| 免费看黄色av| 久久欧美中文字幕| 亚洲の无码国产の无码步美| 高清不卡一区二区| 久久精品国产露脸对白| 日韩精品亚洲一区| 欧洲黄色一级视频| 一区三区视频| 91.com在线| 国产精品二区影院| 婷婷视频在线播放| 久久在线播放| 在线精品日韩| 水蜜桃精品av一区二区| 亚洲欧美日韩精品在线| 国内精品久久久久久久影视简单| 国产一区二区在线网站| 日韩精品三级| 5566av亚洲| 日本免费一区二区三区视频| 91丝袜美腿美女视频网站| 亚洲一区有码| 国产热re99久久6国产精品| 亚洲第一会所001| 日韩免费中文字幕| 三上悠亚亚洲一区| 日本成人精品在线| 欧美91看片特黄aaaa| 日韩免费av在线| 免费高清视频在线一区| 国产精品久久久久高潮| 超碰这里只有精品| 国产精品国语对白| 日韩免费在线电影| 91精品国产自产在线观看永久| 亚洲tv在线| 亚洲一区二区免费| 中文在线免费一区三区| 国产欧美综合精品一区二区| 麻豆成人入口| 久久伊人一区二区| 国产精品一区二区av交换| 天堂资源在线亚洲视频| 99精品美女| 麻豆传媒网站在线观看| 91久久视频| 国产精品亚洲a| 美洲天堂一区二卡三卡四卡视频| 97超碰人人爽| 国产精品1区2区| 漂亮人妻被黑人久久精品| 2017欧美狠狠色| 手机免费观看av| 一二三四社区欧美黄| 亚洲视频免费播放| 欧美亚一区二区| www.av导航| 亚洲人成伊人成综合网久久久| 日本精品一区二区三区在线播放| 欧美美女18p| 在线手机中文字幕| 国产专区欧美专区| 久本草在线中文字幕亚洲| 日韩欧美国产二区| 亚洲一级淫片| 精品视频一区二区在线| 加勒比av一区二区| 俄罗斯黄色录像| 国产精品日产欧美久久久久| 国产在线视频99| 在线精品视频免费播放| 亚洲av无码国产精品久久不卡| 日韩精品在线视频美女| 精品国产丝袜高跟鞋| 91精品国产99久久久久久| 人人玩人人添人人澡欧美| 国产精品一区在线播放| 视频在线不卡免费观看| 大肉大捧一进一出好爽视频| 麻豆视频一区二区| 国产精品成人无码专区| 一区视频在线播放| 亚洲另类在线观看| 日韩欧美国产精品一区| www.在线视频.com| 欧美国产欧美亚洲国产日韩mv天天看完整| 一级毛片久久久| 成人国产1314www色视频| 凹凸成人精品亚洲精品密奴| 奇米影视亚洲色图| 九九国产精品视频| 欧美老熟妇乱大交xxxxx | 色一情一乱一乱一区91| 丝袜国产日韩另类美女| 91人妻一区二区三区| 国产精品丝袜久久久久久app| 日产欧产va高清| 日韩一区二区精品葵司在线| av在线资源网| 欧美一区三区三区高中清蜜桃| 亚洲精品一区在线| 在线一区日本视频| 日韩av一级片| 中文字字幕码一二三区| 亚洲国产人成综合网站| 国产毛片在线视频| 最近2019中文字幕mv免费看 | yw193.com尤物在线| 3344国产精品免费看| 97成人在线| 9色视频在线观看| 精品亚洲porn| 免费成人深夜蜜桃视频| 91成人免费在线| 手机亚洲第一页| 97超碰国产精品女人人人爽 | 最近高清中文在线字幕在线观看1| 999视频在线免费观看| 亚洲精品97| 亚洲天堂一区二区在线观看| 中文字幕的久久| 老熟妇一区二区三区啪啪| 亚洲人午夜色婷婷| 偷拍中文亚洲欧美动漫| 欧美另类视频在线| 亚欧美中日韩视频| 国产交换配乱淫视频免费| 欧美日韩亚洲一区二区三区| 污视频软件在线观看| 午夜免费日韩视频| 九色丨蝌蚪丨成人| 亚洲自偷自拍熟女另类| 91麻豆精东视频| 免费看毛片网站| 亚洲天堂av综合网| 国产成人毛片| 日韩国产精品毛片| 国产91精品一区二区麻豆亚洲| 欧美精品一级片| 精品福利视频一区二区三区| 国产99在线观看| 欧美一区二区三区在线播放 | 国户精品久久久久久久久久久不卡| gogo亚洲国模私拍人体| 亚洲午夜免费福利视频| 五月婷婷开心中文字幕| 日本欧美在线视频| 不卡日本视频| 一级网站在线观看| 亚洲午夜久久久久久久久久久| 天堂影院在线| 国产精品国产三级国产专播精品人| 97在线精品| 国产大尺度视频| 色综合久久66| 麻豆网站在线看| 粉嫩高清一区二区三区精品视频| 国产亚洲精品bv在线观看| 欧美狂猛xxxxx乱大交3| 欧美色大人视频| av免费网站在线观看| 久久精品国产综合精品| 日本怡春院一区二区| www.av视频| 日韩精品中文字幕久久臀| 亚洲伦理一区二区| 国产精品又粗又长| 欧美极品少妇xxxxⅹ高跟鞋| www.成人在线观看| 青青久久aⅴ北条麻妃| 天天超碰亚洲| 亚洲精品乱码久久| 欧美日韩国产综合一区二区 | 日韩在线不卡| 欧亚乱熟女一区二区在线| 欧美日韩一区中文字幕| 久久青青色综合| 亚洲精品国产系列| 成人av影院在线| 国产精品乱码久久久| 555www成人网| 亚洲五月综合|