SQL 窗口函數(shù)(Window Function)是一種在數(shù)據(jù)庫查詢中執(zhí)行跨行計算的高級功能。它不會合并多行結(jié)果(如 GROUP BY),而是為每一行返回一個基于指定窗口范圍的計算結(jié)果,同時保留原始行的所有細節(jié)。
核心概念(中文術語)
- 窗口(Window)
定義函數(shù)計算的數(shù)據(jù)范圍,由OVER()子句指定。 - 分區(qū)(PARTITION BY)
將數(shù)據(jù)按列分組,函數(shù)在每個分區(qū)內(nèi)獨立計算(類似分組)。 - 排序(ORDER BY)
定義分區(qū)內(nèi)數(shù)據(jù)的排序方式,影響計算順序。 - 窗口框架(Window Frame)
指定當前行相關的計算范圍(如 "前3行到后1行")。
常用窗口函數(shù)分類
1. 排名函數(shù)
| 函數(shù) | 作用 | 示例(按分數(shù)排名) | |
|---|---|---|---|
ROW_NUMBER() |
生成唯一序號(相同值也按順序編號) | → | 1, 2, 3, 4 |
RANK() |
并列時跳過后續(xù)名次 | → | 1, 1, 3, 4 |
DENSE_RANK() |
并列時不跳名次 | → | 1, 1, 2, 3 |
NTILE(n) |
將數(shù)據(jù)分為 n 組并編號 |
→ | 分4組:1,1,2,2,3,3,4,4 |
2. 聚合函數(shù)(支持窗口計算)
| 函數(shù) | 作用 |
|---|---|
SUM(列) OVER() |
窗口內(nèi)求和 |
AVG(列) OVER() |
窗口內(nèi)平均值 |
COUNT(列) OVER() |
窗口內(nèi)計數(shù) |
MAX(列) OVER() |
窗口內(nèi)最大值 |
MIN(列) OVER() |
窗口內(nèi)最小值 |
3. 偏移函數(shù)
| 函數(shù) | 作用 |
|---|---|
LAG(列, 偏移量) |
獲取當前行之前的第 N 行數(shù)據(jù) |
LEAD(列, 偏移量) |
獲取當前行之后的第 N 行數(shù)據(jù) |
FIRST_VALUE(列) |
獲取窗口內(nèi)第一行的值 |
LAST_VALUE(列) |
獲取窗口內(nèi)最后一行的值 |
語法結(jié)構(gòu)
SELECT
列1, 列2,
窗口函數(shù)(列) OVER (
[PARTITION BY 分組列]
[ORDER BY 排序列 [ASC|DESC]]
[ROWS|RANGE 范圍子句]
) AS 結(jié)果列名
FROM 表名;
實際案例
數(shù)據(jù)表 sales
| date | product | amount |
|---|---|---|
| 2023-01-01 | A | 100 |
| 2023-01-02 | A | 200 |
| 2023-01-03 | A | 150 |
| 2023-01-01 | B | 50 |
示例 1:計算每個產(chǎn)品的累計銷售額
SELECT
date, product, amount,
SUM(amount) OVER (
PARTITION BY product
ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;
| 結(jié)果: | date | product | amount | running_total |
|---|---|---|---|---|
| 2023-01-01 | A | 100 | 100 | |
| 2023-01-02 | A | 200 | 300 | |
| 2023-01-03 | A | 150 | 450 | |
| 2023-01-01 | B | 50 | 50 |
示例 2:計算每個產(chǎn)品銷售額的排名
SELECT
product, amount,
RANK() OVER (
PARTITION BY product
ORDER BY amount DESC
) AS rank
FROM sales;
| 結(jié)果(產(chǎn)品A內(nèi)部排名): | product | amount | rank |
|---|---|---|---|
| A | 200 | 1 | |
| A | 150 | 2 | |
| A | 100 | 3 | |
| B | 50 | 1 |
關鍵技巧
- 動態(tài)范圍:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW→ 當前行+前2行RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW→ 時間范圍
- 省略范圍:
若僅用ORDER BY未指定范圍,默認RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(從分區(qū)首行到當前行)。 - 性能:
合理使用PARTITION BY和索引可提升效率。
? 窗口函數(shù)在數(shù)據(jù)分析中廣泛應用,如計算移動平均、累計占比、數(shù)據(jù)排名等場景,能大幅簡化復雜查詢邏輯。
sql中日期函數(shù)的用法
日期函數(shù)在SQL中是非常重要的功能之一,它們能幫助我們在數(shù)據(jù)庫中存儲和處理日期和時間數(shù)據(jù)。在本文中,我將詳細介紹一些常用的SQL日期函數(shù),包括如何創(chuàng)建日期和時間數(shù)據(jù)、如何格式化和轉(zhuǎn)換日期、以及如何在
2023-11-17 16:24:51
常用SQL函數(shù)及其用法
SQL(Structured Query Language)是一種用于管理和操作關系數(shù)據(jù)庫的編程語言。SQL 提供了豐富的函數(shù)庫,用于數(shù)據(jù)檢索、數(shù)據(jù)更新、數(shù)據(jù)刪除以及數(shù)據(jù)聚合等操作。以下是一些常用
2024-11-19 10:18:59
如何用Rust過程宏魔法簡化SQL函數(shù)呢?
這是 RisingWave 中一個 SQL 函數(shù)的實現(xiàn)。只需短短幾行代碼,通過在 Rust 函數(shù)上加一行過程宏,我們就把它包裝成了一個 SQL 函數(shù)。
2024-01-23 09:43:34
Devart數(shù)據(jù)庫開發(fā)和管理軟件:SQL Server
通過逐步執(zhí)行、調(diào)用堆棧瀏覽、斷點和監(jiān)視來觀察SQL腳本、存儲過程、觸發(fā)器和函數(shù)在運行時的行為,從而查找它們中的錯誤。在“監(jiān)視”窗口中計算例程中聲明的變量和參數(shù)。
2023-03-31 10:04:17
長期用眼不再怕!NineData SQL 窗口支持深色模式
、改善低光環(huán)境,并適用于開發(fā)人員、夜間工作者和移動設備用戶等不同群體。您可以在NineData SQL窗口中嘗試深色模式,享受更加舒適和愉悅的使用體驗。
2023-09-26 10:24:06
MySQL去重3種方法分享
在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函數(shù)的 sql(如Hive SQL、Oracle等等) 中還可以使用 row_number 窗口函數(shù)進行去重。
2023-06-26 11:05:39
oracle執(zhí)行sql查詢語句的步驟是什么
。以下是對每個步驟的詳盡、詳實、細致的解釋。 編寫SQL語句: SQL(結(jié)構(gòu)化查詢語言)是一種用于與數(shù)據(jù)庫進行通信的標準語言。在使用Oracle執(zhí)行SQL查詢之前,首先需要編寫SQL語句。SQL語句由關鍵字、表名、列名、運算符、函數(shù)等組成,用于指定所需的數(shù)據(jù)和操作。 解析
2023-12-06 10:49:29
SQL語句的兩種嵌套方式
一般情況下,SQL語句是嵌套在宿主語言(如C語言)中的。有兩種嵌套方式:1.調(diào)用層接口(CLI):提供一些庫,庫中的函數(shù)和方法實現(xiàn)SQL的調(diào)用2.直接嵌套SQL:在代碼中嵌套SQL語句,提交給預處理器,將SQL語句轉(zhuǎn)換成對宿主語言有意義的內(nèi)容,如調(diào)用庫中的函數(shù)和方法代替SQL語句
60user79
2019-05-23 08:51:34
NineData SQL AI 智能補全上線:寫 SQL,不必每次都從頭敲
。用戶只需在SQL窗口輸入時按Tab鍵即可快速補全灰色提示內(nèi)容,無需改變原有操作習慣。這項集成在NineDataSQL窗口的輕量化功能,有效減少了編寫過程中的思路切換和結(jié)構(gòu)確認時間,讓SQL編寫更加流暢高效。
2026-04-01 20:19:49
SQL語言的兩種使用方式
編寫)-DBMS預處理程序-預處理過的源程序(嵌入的SQL語句已轉(zhuǎn)換成函數(shù)調(diào)用形式)-宿主語言編譯程序(SQL函數(shù)定義庫)-目標程序嵌入式SQL涉及到SQL語句在主語言程序中的使用規(guī)定,以解決兩種語言的不一致和相互聯(lián)系的問題。...
張峰9998
2021-12-20 06:51:26
深入分析慢SQL的排查、解決思路
出于一些歷史原因有的SQL查詢可能非常復雜,需要同時關聯(lián)非常多的表,使用一些復雜的函數(shù)、子查詢,這樣的SQL在項目初期由于數(shù)據(jù)量比較少,不會對數(shù)據(jù)庫造成較大的壓力,但是隨著時間的積累以及業(yè)務的發(fā)展,這些SQL慢慢就會轉(zhuǎn)變?yōu)槁?span id="muikaa0wy" class='flag-2' style='color: #FF6600'>SQL,對數(shù)據(jù)庫的性能產(chǎn)生一定的影響。
2023-10-31 10:29:33
SQL后悔藥,SQL性能優(yōu)化和SQL規(guī)范優(yōu)雅
每一個好習慣都是一筆財富,本文基于MySQL,分SQL后悔藥, SQL性能優(yōu)化,SQL規(guī)范優(yōu)雅三個方向,分享寫SQL的21個好習慣,謝謝閱讀,加油哈~ 1. 寫完SQL先explain查看執(zhí)行計劃
2020-11-14 09:54:27
最實用的SQL語句快來收藏學習吧
文章沿著設計一個假想的應用 awesome_app 為主線,從零創(chuàng)建修改數(shù)據(jù)庫,表格,字段屬性,索引,字符集,默認值,自增,增刪改查,多表查詢,內(nèi)置函數(shù)等實用 SQL 語句。收藏此文,告別零散又低效
2019-12-21 11:04:13
MyBatis動態(tài)sql是什么?MyBatis動態(tài)SQL最全教程
動態(tài) SQL 是 MyBatis 的強大特性之一。在 JDBC 或其它類似的框架中,開發(fā)人員通常需要手動拼接 SQL 語句。根據(jù)不同的條件拼接 SQL 語句是一件極其痛苦的工作。
2023-08-10 10:18:02
區(qū)分SQL語句與主語言語句
為了區(qū)分SQL語句與主語言語句,所有SQL 語句必須加前綴EXEC SQL處理過程:含嵌入式SQL語句的主語言程序預編譯程序轉(zhuǎn)換嵌入式SQL語句為函數(shù)調(diào)用轉(zhuǎn)換后的主語言程序(形式上消除了SQL)主語
新星之火12138
2021-10-28 08:44:39
MySQL流程函數(shù)的操作方法
流程函數(shù)是一類很常用的函數(shù),我們可以通過流程函數(shù)在SQL語句中實現(xiàn)條件選擇,能實現(xiàn)我們想要的條件判斷。下表列出了MySQL中的流程函數(shù)。
2020-04-16 17:17:15
SQL編程技術的特點有哪些
SQL的處理過程嵌入式SQL是將SQL語言嵌入程序設計語言中,被嵌入的程序設計語言,如C++,C,JAVA等稱為宿主語言,簡稱主語言過程如下1:含嵌入式SQL語句的主語言程序。2:關系數(shù)據(jù)庫管理系統(tǒng)預處理程序轉(zhuǎn)換嵌入式SQL語句為函數(shù)調(diào)用。3:轉(zhuǎn)換后的主語言程序。4:主語言編譯程序編譯處理。5:
hdfsf
2021-12-22 07:04:22
php的mysqli_query的函數(shù)處理
mysqli_query是PHP中用于執(zhí)行SQL查詢的函數(shù)。它允許我們將SQL語句發(fā)送到MySQL數(shù)據(jù)庫,并返回一個結(jié)果集(如果適用)。在本文中,我們將詳細介紹mysqli_query函數(shù)的使用,并
2023-12-04 16:03:50
深度剖析SQL中的Grouping Sets語句1
SQL 中 `Group By` 語句大家都很熟悉, **根據(jù)指定的規(guī)則對數(shù)據(jù)進行分組** ,常常和**聚合函數(shù)**一起使用。
2023-05-10 17:44:11
什么是SQL注入?Java項目防止SQL注入方式
Java項目防止SQL注入方式 這里總結(jié)4種: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 對請求參數(shù)的敏感詞匯進行過濾 nginx反向代理防止SQL注入
2023-10-16 14:26:34
嵌入式SQL程序是由什么組成的
的C程序 (.c),并且后來它能夠被一個C編譯器所處理。轉(zhuǎn)換過的ECPG應用會通過嵌入式SQL庫(ecpglib)調(diào)用libpq庫中的函數(shù),并且與PostgresSQL服務器使用普通的前端/后端協(xié)議
hgimtk
2021-12-15 07:26:54
深度剖析SQL中的Grouping Sets語句2
SQL 中 `Group By` 語句大家都很熟悉, **根據(jù)指定的規(guī)則對數(shù)據(jù)進行分組** ,常常和**聚合函數(shù)**一起使用。
2023-05-10 17:44:27
如何去使用WWDG窗口看門狗操作庫函數(shù)
窗口看門狗的操作步驟有哪些?怎樣去編寫窗口看門狗的主程序和子程序?如何去使用WWDG窗口看門狗操作庫函數(shù)?
飄逸的D
2021-08-03 07:10:38
窗口看門狗( WWDG)庫函數(shù)配置有哪些步驟
窗口看門狗( WWDG)是如何工作的?窗口看門狗( WWDG)有哪些相關的寄存器?窗口看門狗( WWDG)庫函數(shù)配置有哪些步驟?
xf20160629
2021-08-16 06:04:50
動態(tài)Sql介紹
動態(tài)Sql介紹 動態(tài) SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格
2023-05-31 09:34:42
為什么要動態(tài)sql語句?
為什么要動態(tài)sql語句?因為動態(tài)sql語句能夠提供一些比較友好的機制1、可以使得一些在編譯過程中無法獲得完整的sql語句,在程序執(zhí)行階段動態(tài)的獲得。2、支持動態(tài)組裝 sql語句、動態(tài)參數(shù) 兩種形式動態(tài)sql語句有兩種1、使用sql主變量2、使用動態(tài)參數(shù)...
程序詩人
2021-12-20 06:00:51
怎樣在MATLAB中創(chuàng)建函數(shù)
返回命令窗口。輸入“ make_a_square(3)”,然后按鍵盤上的Enter鍵以測試功能。您的代碼應將數(shù)字3平方,輸出9。如果代碼未執(zhí)行此操作,請檢查以確保在“命令窗口”中正確拼寫了該函數(shù)
2019-11-04 11:07:01
PROC SQL介紹
SQL(Structured Query Language)——結(jié)構(gòu)化查詢語言,是用于檢索和更新數(shù)據(jù)的一種標準化語言,SQL在SAS中通過PROC SQL來實現(xiàn)。
2023-05-19 16:10:41
sql是什么意思網(wǎng)絡用語
sql是什么意思?sql是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫。它是一種專門用于管理關系型數(shù)據(jù)庫系統(tǒng)的編程語言。sql用于執(zhí)行各種數(shù)據(jù)庫操作,包括創(chuàng)建、修改
2023-10-13 17:31:51