SQL:窗口函數(Window Functions)

目錄

什么是窗口函數?

基本語法結構?

為什么要用窗口函數?

常見的窗口函數分類

1?? 排名類函數

2?? 聚合類函數(不影響原始行)

3?? 值訪問函數

窗口范圍說明(ROWS / RANGE)


什么是窗口函數?

窗口函數是一類 SQL 函數,在不分組的情況下,可以對查詢結果中的某一“窗口”范圍內的數據進行計算。

窗口函數 = 能在每一行數據上“看見”其他相關行的函數。

它允許你在不聚合(不合并行)的前提下,對一組相關行進行計算,并把結果加回到原來的每一行上。

不同于聚合函數(如 SUM, AVG),窗口函數不會壓縮行,而是為每一行返回一個計算值。

基本語法結構?

<窗口函數>([參數]) OVER ([PARTITION BY 子句][ORDER BY 子句][ROWS 或 RANGE 子句]
)函數名(...) OVER (PARTITION BY ...   -- 按誰分組(可選)ORDER BY ...       -- 按什么順序(常用)ROWS BETWEEN ...   -- 控制范圍(高級用法)
)
  • PARTITION BY: 把數據分組,每組內獨立執行函數(類似 GROUP BY,但不合并行)。

  • ORDER BY: 確定組內數據順序。

  • ROWS BETWEEN: 精確控制窗口范圍(例如:過去3行)。

舉例:

SELECT department_id,employee_id,salary,RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS rank_in_dept
FROM employees;

為什么要用窗口函數?

在傳統的 SQL 聚合函數(如 SUM, AVG, COUNT)中,如果你寫:

SELECT person_id, SUM(weight)
FROM Queue
GROUP BY person_id;

你得到的是每個 person_id 的總重,但你沒法看到其他人的情況 —— 一條記錄一條記錄獨立計算。

而窗口函數就像給每一行配了一個“望遠鏡”,能看到前面的、后面的或整組內的數據,然后基于這些數據算出“每一行自己的視角”。

舉個通俗例子(排隊上車):

有一張表:

turnperson_nameweight
1Alice250
2Bob300
3Charlie200
4David400

你想知道:每個人上車時,前面所有人(包括自己)累計多重了?

👉 用窗口函數就可以這樣寫:

SELECT person_name,weight,SUM(weight) OVER (ORDER BY turn) AS cumulative_weight
FROM Queue;

輸出結果:

person_nameweightcumulative_weight
Alice250250
Bob300550 (250+300)
Charlie200750 (250+300+200)
David4001150

🚀 神奇的是,你沒有把這些行合并,而是在每行里加上了“前面和自己的累積情況”


常見的窗口函數分類

1?? 排名類函數

函數描述
ROW_NUMBER()每一組數據中按順序分配唯一行號
RANK()同分并列,跳躍排名(如:1,1,3)
DENSE_RANK()同分不跳(如:1,1,2)
NTILE(n)將結果分為 n 個桶,每行給出所屬桶編號

1.ROW_NUMBER()

意義:按順序為每行分配一個“唯一編號”。
名稱:ROW_NUMBER = 行號。

語法示例:

ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num

用途:

  • 對每個部門中員工薪資進行唯一編號(常用于分頁、去重等)

2.RANK()

意義:返回排名,相同值并列排名,后續名次跳躍。
名稱:RANK = 排名。

語法示例:

RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
salaryRANK
10001
10001
9003

3.DENSE_RANK()

意義:與 RANK() 類似,但排名連續不跳躍。
名稱:DENSE_RANK = 密集排名。

語法示例:

DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank
salaryDENSE_RANK
10001
10001
9002

4. NTILE(n)

意義:將數據平均分成 n 個桶,每行返回桶編號。
名稱:NTILE = "N Tile",即“分桶”。

語法示例:

NTILE(4) OVER (ORDER BY salary DESC) AS quartile

用途:

  • 按工資水平將員工劃分為四個檔次(四分位分析)


2?? 聚合類函數(不影響原始行)

函數描述
SUM(), AVG(), MAX(), MIN()聚合函數 + 窗口:在窗口范圍內計算
COUNT()窗口內的行數統計

5. SUM(expr)AVG(expr)MAX(expr)MIN(expr)

意義:在窗口內執行聚合計算,但不影響原始行展示。
名稱:

  • SUM = 總和

  • AVG = 平均

  • MAX = 最大值

  • MIN = 最小值

語法示例:

SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS running_total

用途:

  • 滾動匯總、組內對比等。


3?? 值訪問函數

函數描述
LAG(expr, n, default)返回當前行前第 n 行的值
LEAD(expr, n, default)返回當前行后第 n 行的值
FIRST_VALUE(expr)窗口中的第一個值
LAST_VALUE(expr)窗口中的最后一個值

6. LAG(expr, offset, default)

意義:返回當前行的前 N 行的值。
名稱:LAG = 滯后。

語法示例:

LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY hire_date) AS prev_salary

用途:

  • 分析趨勢、比較環比。

7. LEAD(expr, offset, default)

意義:返回當前行的后 N 行的值。
名稱:LEAD = 領先。

語法示例:

LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY hire_date) AS next_salary

用途:

  • 預測未來、構建時間序列對比。

?8. FIRST_VALUE(expr)

意義:返回窗口中按排序后第一行的值。
名稱:FIRST_VALUE = 第一個值。

語法示例:

FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS first_salary

9. LAST_VALUE(expr)

意義:返回窗口中最后一行的值。
名稱:LAST_VALUE = 最后一個值。

注意: LAST_VALUE 需要配合 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 才能獲取整個分區最后一行值。

LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS last_salary


窗口范圍說明(ROWS / RANGE)

ROWS基于物理行號

ROWS BETWEEN 2 PRECEDING AND CURRENT ROW

?RANGE基于值范圍

RANGE BETWEEN INTERVAL 7 DAY PRECEDING AND CURRENT ROW

常見用途總結

場景推薦函數
排名ROW_NUMBER, RANK, DENSE_RANK
對比趨勢LAG, LEAD, FIRST_VALUE, LAST_VALUE
滾動匯總SUM, AVG, COUNT + ROWS BETWEEN
分段統計NTILE
時間窗口RANGE BETWEEN

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

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

相關文章

相機內參 opencv

視場角定相機內參 import numpy as np import cv2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Ddef calculate_camera_intrinsics(image_width640, image_height480, fov55, is_horizontalTrue):"""計算相機內參矩陣參數:image_w…

MATLAB 各個工具箱 功能說明

? 想必大家在安裝MATLAB時&#xff0c;或多或少會疑惑應該安裝哪些工具箱。筆者遇到了兩種情況——只安裝了MATLAB主程序&#xff0c;老師讓用MATLAB的時候卻發現沒有安裝對應安裝包&#xff1b;第二次安裝學聰明了&#xff0c;全選安裝&#xff0c;嗯……占用了20多個G。 ?…

學習日記-day14-5.23

完成目標&#xff1a; 學習java下半段課程 知識點&#xff1a; 1.多態轉型 知識點 核心內容 重點 多態轉型 向上轉型&#xff08;父類引用指向子類對象&#xff09; 與向下轉型&#xff08;強制類型轉換&#xff09;的機制與區別 向上轉型自動完成&#xff0c;向下轉型需…

【編程語言】【Java】一篇文章學習java,復習完善知識體系

第一章 Java基礎 1.1 變量與數據類型 1.1.1 基本數據類型 1.1.1.1 整數類型&#xff08;byte、short、int、long&#xff09; 在 Java 中&#xff0c;整數類型用于表示沒有小數部分的數字&#xff0c;不同的整數類型有不同的取值范圍和占用的存儲空間&#xff1a; byte&am…

匯量科技前端面試題及參考答案

數組去重的方法有哪些&#xff1f; 在 JavaScript 中&#xff0c;數組去重是一個常見的操作&#xff0c;有多種方法可以實現這一目標。每種方法都有其適用場景和性能特點&#xff0c;下面將詳細介紹幾種主要的去重方法。 使用 Set 數據結構 Set 是 ES6 引入的一種新數據結構&a…

Git實戰演練,模擬日常使用,快速掌握命令

01 引言 上一期借助Idea&#xff0c;完成了Git倉庫的建立、配置、代碼提交等操作&#xff0c;初步入門了Git的使用。然而日常開發中經常面臨各種各樣的問題&#xff0c;入門級的命令遠遠不夠使用。 這一期&#xff0c;我們將展開介紹Git的日常處理命令&#xff0c;解決日常問…

wordpress主題開發中常用的12個模板文件

在WordPress主題開發中&#xff0c;有多種常用的模板文件&#xff0c;它們負責控制網站不同部分的顯示內容和布局&#xff0c;以下是一些常見的模板文件&#xff1a; 1.index.php 這是WordPress主題的核心模板文件。當沒有其他更具體的模板文件匹配當前頁面時&#xff0c;Wor…

數據庫blog5_數據庫軟件架構介紹(以Mysql為例)

&#x1f33f;軟件的架構 &#x1f342;分類 軟件架構總結為兩種主要類型&#xff1a;一體式架構和分布式架構 ● 一體化架構 一體式架構是一種將所有功能集成到一個單一的、不可分割的應用程序中的架構模式。這種架構通常是一個大型的、復雜的單一應用程序&#xff0c;包含所…

離線服務器算法部署環境配置

本文將詳細記錄我如何為一臺全新的離線服務器配置必要的運行環境&#xff0c;包括基礎編譯工具、NVIDIA顯卡驅動以及NVIDIA-Docker&#xff0c;以便順利部署深度學習算法。 前提條件&#xff1a; 目標離線服務器已安裝操作系統&#xff08;本文以Ubuntu 18.04為例&#xff09…

chromedp -—— 基于 go 的自動化操作瀏覽器庫

chromedp chromedp 是一個用于 Chrome 瀏覽器的自動化測試工具&#xff0c;基于 Go 語言開發&#xff0c;專門用于控制和操作 Chrome 瀏覽器實例。 chromedp 安裝 go get -u github.com/chromedp/chromedp基于chromedp 實現的的簡易學習通刷課系統 目前實現的功能&#xff…

高級特性實戰:死信隊列、延遲隊列與優先級隊列(三)

四、優先級隊列&#xff1a;優先處理重要任務 4.1 優先級隊列概念解析 優先級隊列&#xff08;Priority Queue&#xff09;是一種特殊的隊列數據結構&#xff0c;它與普通隊列的主要區別在于&#xff0c;普通隊列遵循先進先出&#xff08;FIFO&#xff09;的原則&#xff0c;…

python打卡day34

GPU訓練及類的call方法 知識點回歸&#xff1a; CPU性能的查看&#xff1a;看架構代際、核心數、線程數GPU性能的查看&#xff1a;看顯存、看級別、看架構代際GPU訓練的方法&#xff1a;數據和模型移動到GPU device上類的call方法&#xff1a;為什么定義前向傳播時可以直接寫作…

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件&#xff0c;它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧&#xff0c;軟件大小僅1.14MB&#xff0c;打開即可直接使用&#xff0c;無需進行安裝。 添加功能列舉 它…

Gemini 2.5 Pro 一次測試

您好&#xff0c;您遇到的重定向循環問題&#xff0c;即在 /user/messaging、/user/login?return_to/user/messaging 和 /user/login 之間反復跳轉&#xff0c;通常是由于客戶端的身份驗證狀態檢查和頁面重定向邏輯存在沖突或競爭條件。 在分析了您提供的代碼&#xff08;特別…

vue3前端后端地址可配置方案

在開發vue3項目過程中&#xff0c;需要切換不同的服務器部署&#xff0c;代碼中配置的服務需要可靈活配置&#xff0c;不隨著run npm build把網址打包到代碼資源中&#xff0c;不然每次切換都需要重新run npm build。需要一個配置文件可以修改服務地址&#xff0c;而打包的代碼…

大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調…

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;字符串函數09&#xff0c;strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組&#xff0c;且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組&#xff0c;但我們想要的是最大子數組&#xff0c;所以f[i]表示&#xff1a;以i位置為結尾&#xff0c;所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…