SQL窗口函數詳解

詳細說明在sql中窗口函數是什么,為什么需要窗口函數,有普通的聚合函數了那窗口函數的意義在哪,窗口函數的執行邏輯是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛點,哼哼~)

1.什么是窗口函數?

窗口函數(Window Functions)是SQL中的一種功能強大的工具,用于對查詢結果集中的每一行進行計算,而無需對數據進行分組(GROUP BY)。與聚合函數不同,窗口函數不會將行匯總到一條記錄中,而是保留原始行,并在此基礎上添加計算結果。窗口函數常用于排名、累積和、滑動窗口計算等。

2.為什么需要窗口函數(為什么普通的聚合函數不行)

2.1四點原因

按行計算而不改變行的結構
?? ???? ?窗口函數能夠在不改變行結構的情況下對數據進行計算。與聚合函數(如SUM、AVG等)不同,窗口函數不會將多行數據聚合成一行,而是對每一行進行計算并返回結果,同時保留原始行。這在許多分析場景中非常有用,例如累積和、排名計算等。
支持復雜的分析計算:
?? ???? ?窗口函數可以進行復雜的分析計算,包括排名、累積和、滑動平均等。這些計算在財務分析、時間序列分析和數據挖掘中非常常見。例如,使用窗口函數可以計算每個銷售員的銷售排名、某產品在不同時間段的累積銷售量等。
靈活的分區和排序機制:
?? ???? ?窗口函數支持按分區和排序進行計算,提供了極大的靈活性。可以根據需要按特定列進行分區(PARTITION BY),并在每個分區內按某列排序(ORDER BY)。這使得可以在多個維度上進行復雜的數據分析。例如,可以按客戶ID和時間進行分區和排序,從而分析每個客戶在不同時間段的行為變化。
保持數據的上下文關系
?? ???? ?窗口函數能夠保持數據的上下文關系。在進行累積計算或滑動窗口計算時,窗口函數能夠在當前行的基礎上考慮前后多行的數據。這在時間序列分析中尤為重要,例如計算滾動平均值、滾動總和等。
提高查詢的可讀性和維護性:
?? ???? ?使用窗口函數可以使SQL查詢更加簡潔和可讀。相比于嵌套的子查詢或復雜的JOIN操作,窗口函數提供了一種更直觀的方式來表達復雜的計算邏輯。這不僅提高了查詢的可讀性,還降低了維護的難度。

2.2舉幾個例子

例子1:計算每篇文章在每個時間點的累積觀看人數

SELECT artical_id,dt,SUM(diff) OVER (PARTITION BY artical_id ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_viewers
FROM combined
ORDER BY artical_id, dt;

在這個例子當中,窗口函數可以很方便的選擇包括當前行在內的其以前的所有行

例2:計算每個銷售員的銷售額排名

SELECT salesperson,sales,RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
FROM sales_data;

在這個例子當中,使用窗口函數做一個“開窗”,類似單獨拖出一個小窗口,在這個小窗口中選定一個標準對銷售員進行排序,在這個小窗口中,每一行數據都得到了自己的排名,然后帶著這個排名回到主查詢中;這個過程中,主查詢既沒有使用group by分組,也沒有order by來產生排名,也沒有使用子查詢,但是每一個銷售員卻得到了自己地區中的排名,這就是剛剛提到的對每一行進行計算并返回結果,同時保留原始行。

3.窗口函數的執行邏輯是什么(over怎么用)

只有了解了窗口函數的執行邏輯才能在復雜的查詢中正確運用窗口函數

3.1?生成基礎結果集

首先,SQL引擎會執行查詢語句中的FROM子句、WHERE子句、GROUP BY子句和HAVING子句,生成基礎結果集。這個結果集包含了所有符合條件的數據。所以窗口函數會在拿到所在主查詢的基礎結果集后才生效!

3.2 分區(Partitioning)

在執行窗口函數時,OVER子句中的PARTITION BY子句會將基礎結果集劃分為多個分區。每個分區獨立處理,窗口函數將在每個分區內單獨執行。如果沒有指定PARTITION BY,則視為一個整體分區。注意這個分區是在窗口內單獨做的,并沒有對主查詢中的結果或者說每一行產生影響。

3.3 排序(Ordering)

在每個分區內,根據OVER子句中的ORDER BY子句進行排序。排序定義了窗口函數的計算順序,確保計算按指定的順序進行。注意這個排序也是在窗口內單獨做的,并沒有對主查詢中的結果或者說每一行產生影響。

3.4 定義窗口幀(Frame)

窗口幀定義了窗口函數計算的行范圍。窗口幀由ROWS或RANGE子句指定。

從2、3中,不難看出,這有一個易混淆的點(也是本人混淆過的點),那就是over中的分區和排序 本質上 是在定義窗口函數的計算方式,和主查詢中的group by和order by(如果有的話)并無關系!!!!!

3.5 舉個例子

這個例子是在一個uid-用戶ID, artical_id-文章ID, in_time-進入時間, out_time-離開時間組成的表的基礎上,統計每篇文章同一時刻最大在看人數


SELECTartical_id,MAX(instant_viewer_cnt) max_uv
FROM (SELECTartical_id,dt,SUM(diff) OVER(PARTITION BY artical_id ORDER BY dt, diff DESC) instant_viewer_cntFROM (SELECT artical_id, in_time dt, 1 diffFROM tb_user_logWHERE artical_id != 0UNION ALLSELECT artical_id, out_time dt, -1 diffFROM tb_user_logWHERE artical_id != 0) t1 group byartical_id,dt
) t2
GROUP BY 1
ORDER BY 2 DESC

這里t1表是通過編碼操作和union操作生成的瞬時動作表,我們為了從t1的瞬時動作得到每個時刻的狀態表t2,所以需要窗口函數來做聚合,窗口函數中的order by只是定義sum的計算方式,如果要想主查詢中也是按照artical_id和dt的順序來呈現結果那么,是需要顯式地在真正的order by中寫出來的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40569.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言編譯和編譯預處理

編譯預處理 ? 編譯是指把高級語言編寫的源程序翻譯成計算機可識別的二進制程序(目標程序)的過程,它由編譯程序完成。 ? 編譯預處理是指在編譯之前所作的處理工作,它由編譯預處理程序完成 在對一個源程序進行編譯時,…

全國青少年軟件編程等級考試-四級-奇偶之和(真題)

題目:奇偶之和 1.準備工作 (1)保留舞臺中的小貓角色; 2.功能實現 (1)分別計算1~100中,奇數之和,偶數之和; (2)說出奇數之和,偶數之和。 講解: 1、如何判斷奇偶數 奇數是指除以2有…

C++deque容器

文章目錄 deque容器概念deque操作deque對象的帶參數構造deque頭部和末尾的添加移除操作deque的數據存取deque與迭代器deque賦值deque插入deque刪除 deque容器概念 deque是雙端數組,而vector是單端的。 ?deque頭部和尾部添加或移除元素都非常快速, 但是在中部安插元…

在x86/amd64的機器上使用Docker運行arm64v8/ubuntu并安裝ROS1

一、準備工作 主要是因為國內網絡的問題,可能導致鏡像拉取失敗,解決辦法參考:鏡像加速 二、安裝運行過程 2.1拉取鏡像: sudo docker pull arm64v8/ubuntu:20.04這個是ubuntu的拉取指令,其他的也是類似。 2.2 運行…

【DevOps】運維過程中經常遇到的Http錯誤碼問題分析(一)

一、解決HTTP 408錯誤:上傳3M文件時請求超時的問題 在開發Web應用程序時,遇到HTTP 408狀態碼(請求超時)是常見的問題。特別是在上傳大文件時,這種情況更容易發生。本文將探討在上傳一個3M文件時,Web服務器…

LeetCode題練習與總結:排序鏈表--148

一、題目描述 給你鏈表的頭結點 head ,請將其按 升序 排列并返回 排序后的鏈表 。 示例 1: 輸入:head [4,2,1,3] 輸出:[1,2,3,4]示例 2: 輸入:head [-1,5,3,4,0] 輸出:[-1,0,3,4,5]示例 3&am…

封鎖-封鎖模式(共享鎖、排他鎖)、封鎖協議(兩階段封鎖協議)

一、引言 1、封鎖技術是目前大多數商用DBMS采用的并發控制技術,封鎖技術通過在數據庫對象上維護鎖來實現并發事務非串行調度的沖突可串行化 2、基于鎖的并發控制的基本思想是: 當一個事務對需要訪問的數據庫對象,例如關系、元組等進行操作…

【嵌入式開發 Linux 常用命令系列 1.6 -- grep 過濾指定的目錄】

請閱讀【嵌入式開發學習必備專欄 】 文章目錄 grep 過濾指定目錄 grep 過濾指定目錄 在Linux中使用grep搜索字符串并希望排除特定目錄時,可以使用--exclude-dir參數。這個參數允許你指定一個或多個目錄名稱來排除它們的內容不被grep搜索。這對于忽略一些常見的臨時…

LLM - 詞向量 Word2vec

1. 詞向量是一個詞的低維表示,詞向量可以反應語言的一些規律,詞意相近的詞向量之間近乎于平行。 2. 詞向量的實現: (1)首先使用滑動窗口來構造數據,一個滑動窗口是指在一段文本中連續出現的幾個單詞&#x…

llamaindex實戰-使用本地大模型和數據庫對話

概述 本文使用NLSQLTableQueryEngine 查詢引擎來構建SQL的自然語言處理查詢。 請注意,我們需要指定要與該查詢引擎一起使用的表。如果我們不這樣做,查詢引擎將提取所有架構上下文,這可能會溢出 LLM 的上下文窗口。 在以下情況都可以使用NL…

如何用Java寫一個整理Java方法調用關系網絡的程序

大家好,我是猿碼叔叔,一位 Java 語言工作者,也是一位算法學習剛入門的小學生。很久沒有為大家帶來干貨了。 最近遇到了一個問題,大致是這樣的:如果給你一個 java 方法,如何找到有哪些菜單在使用。我的第一想…

線程中如何有效避免死鎖問題

1. 理解死鎖形成的原因 互斥條件:一個資源每次只能被一個線程使用。 請求與保持條件:線程因請求資源而阻塞時,對已獲得的資源保持不放。 不剝奪條件:線程已獲得的資源,在末使用完之前,不能強行剝奪。 循環…

c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關系

c primer plus 第15章友,異常和其他:15.1.3 其他友元關系 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 15.1.3 其他友元關系 提示:寫完文章后,目錄可以自動生成,如何生成可…

整潔架構SOLID-單一職責原則(SRP)

文章目錄 定義案例分析重復的假象代碼合并解決方案 小結 定義 SRP是SOLID五大設計原則中最容易被誤解的一個。也許是名字的原因,很多程序員根據SRP這個名字想當然地認為這個原則就是指:每個模塊都應該只做一件事。 在歷史上,我們曾經這樣描…

科研繪圖系列:R語言雙側條形圖(bar Plot)

介紹 雙側條形圖上的每個條形代表一個特定的細菌屬,條形的高度表示該屬的LDA得分的對數值,顏色用來區分不同的分類群或組別,它具有以下優點: 可視化差異:條形圖可以直觀地展示不同細菌屬在得分上的差異。強調重要性:較高的條形表示某些特征在區分不同組別中具有重要作用…

# Sharding-JDBC從入門到精通(6)-- Sharding-JDBC 水平分庫 和 垂直分庫。

Sharding-JDBC從入門到精通&#xff08;6&#xff09;-- Sharding-JDBC 水平分庫 和 垂直分庫。 一、Sharding-JDBC 水平分庫-分片策略配置 1、分庫策略定義方式如下 # 分庫策略&#xff0c;如何將一個邏輯表映射到多個數據源 spring.shardingsphere.sharding.tables.<邏…

第33集《大乘起信論》

《大乘起信論》和尚尼慈悲&#xff0c;諸位法師、諸位居士&#xff0c;阿彌陀佛&#xff01;&#xff08;阿彌陀佛&#xff01;&#xff09;請大家打開《講義》第七十四頁&#xff0c;子二、釋觀。 本論的特色&#xff0c;一言以蔽之就是文簡意賅、辭約理富&#xff0c;就是說…

VUE2拖拽組件:vue-draggable-resizable-gorkys

vue-draggable-resizable-gorkys組件基于vue-draggable-resizable進行二次開發, 用于可調整大小和可拖動元素的組件并支持沖突檢測、元素吸附、元素對齊、輔助線 安裝: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…

嵌入式linux面試1

1. linux 1.1. Window系統和Linux系統的區別 linux區分大小寫windows在dos&#xff08;磁盤操作系統&#xff09;界面命令下不區分大小寫&#xff1b; 1.2. 文件格式區分 windows用擴展名區分文件&#xff1b;如.exe代表執行文件&#xff0c;.txt代表文本文件&#xff0c;.…

運用Python與Keras框架打造深度學習圖像分類應用:詳盡步驟與代碼實例解析

引言 隨著深度學習技術的飛速發展&#xff0c;其在圖像識別和分類領域的應用日益廣泛。在這一背景下&#xff0c;Python因其豐富的數據科學庫和強大的生態系統而成為首選編程語言之一。在本文中&#xff0c;我們將深入探討如何使用Python和其中的Keras深度學習框架來完成一個實…