目錄
2。常見用例和示例
在組中排名
運行總計和移動平均
訪問上一行或下一行
百分比和分配分析
3。關鍵技巧和最佳實踐
首頁 資料庫 SQL 如何在SQL中使用窗口函數

如何在SQL中使用窗口函數

Aug 26, 2025 am 05:31 AM

SQL中的窗口函數啟用跨相關行的計算,而不會崩潰,允許在分區內進行排名,運行總計,移動平均值和行比較。基本語法在(按sort_expression frame_claueser通過partition_expression訂單進行分區的function_name(expression)),其中按組行劃分,在分區內按序列進行訂單,然後frame_clauesh定義了行的窗口。對於排名,rank(),row_number()和dense_rank()在組內分配等級,而處理領帶的差異。運行總計使用sum()與訂單和行無界的前面的訂單,而移動平均值時,將avg()應用於框架上的框架和當前行之間的框架。 lag()和Lead()訪問上一個或下一個行值以進行更改分析。 NTILE() divides data into buckets (eg, quartiles), and PERCENT_RANK() gives relative rank from 0 to 1. Best practices include always using OVER(), applying PARTITION BY for group-level calculations, using ORDER BY for sequence-sensitive logic, choosing ROWS or RANGE frames appropriately, and avoiding window functions in WHERE clauses by using CTEs or subqueries for filtering.這些功能在PostgreSQL,SQL Server,BigQuery,Snowflake,Oracle,Oracle和MySQL 8.0中得到支持,當需要從周圍的行中上下文時,使復雜的分析查詢更加有效,更可讀。

如何在SQL中使用窗口函數

SQL中的窗口函數讓您可以在與當前行相關的一組行中執行計算,而無需將它們折疊成單個輸出行 - 類似於組的匯總函數。它們對於數據分區中的排名,運行總數,移動平均值和比較特別有用。

這是有效使用窗口功能的方法:


1。窗口函數的基本語法

窗口函數的一般結構是:

 function_name(表達式)
    [通過partition_expression分區]
    [通過sort_expression訂購]
    [frame_clause]
)
  • function_name :示例包括ROW_NUMBER()RANK()SUM()AVG()LAG() ,等。
  • PARTITION BY :將設置的結果分為分區(如組)。該函數應用於每個分區。
  • ORDER BY :確定每個分區內的行順序。
  • frame_clause :定義當前行周圍的行(例如,“窗框”)的子集(例如, ROWS BETWEEN 3 PRECEDING AND CURRENT ROW )。

注意:與組不同,使用窗口函數將所有行保存在結果集中。


2。常見用例和示例

在組中排名

使用RANK()ROW_NUMBER()DENSE_RANK()在類別中對項目進行排名。

選擇 
    姓名,
    部門,
    薪水,
    等級()超過(按工資desc按部門訂單分區)為dept_salary_rank
來自員工;

這在每個部門內按薪水進行排名。

如果您想要唯一的等級(即使有綁帶),則使用ROW_NUMBER()RANK()以及DENSE_RANK()沒有差距。


運行總計和移動平均

隨著時間的流逝,計算累積總和或滾動平均值。

選擇 
    日期,
    銷售量,
    sum(sales)超過(按日期行訂購訂單無綁定的上述)作為running_total,
    AVG(銷售)超過(按日期排按日期和當前行之間的日期行)為七日_AVG
來自Daily_sales;
  • ROWS UNBOUNED PRECEDING :從一開始就包括所有行。
  • ROWS BETWEEN 6 PRECEDING AND CURRENT ROW :給出7天的移動平均線。

訪問上一行或下一行

使用LAG()LEAD()將當前行值與上一個或下一個相比。

選擇 
    日期,
    收入,
    滯後(收入,1)以上(按日期訂購)為prev_day_revenue,
    收入 - 滯後(收入,1)以上(按日期訂購)
來自daily_revenue;
  • LAG(revenue, 1)從上排獲得收入。
  • 用於計算增長,變化或趨勢。

您也可以使用LEAD()來展望。


百分比和分配分析

使用NTILE()將行分為相對等級的桶或PERCENT_RANK()

選擇 
    姓名,
    薪水,
    ntile(4)以上(薪金)為salary_quartile
來自員工;

這將員工分為4個薪水組(四分位數)。

選擇 
    姓名,
    薪水,
    百分比(按薪金訂單)為百分比
來自員工;

給出相對等級為0到1之間的值。


3。關鍵技巧和最佳實踐

  • 始終包含OVER() - 無需它,該函數無法用作窗口函數。
  • 使用PARTITION BY時,您需要每組單獨的計算(例如每個部門,每個地區)。
  • 請謹慎對待ORDER BY ,它會影響排名和基於框架的計算。
  • 諸如ROWSRANGE類的框架子句是可選的,但對於精確控制很重要:
    • ROWS物理行位置上工作。
    • RANGE在邏輯值範圍內工作(通常ORDER BY使用)。
  • 避免在直接的子句中使用窗口函數(它們之後發生)。如果需要過濾,將它們包裹在子查詢或CTE中。

CTE的示例:

與排名
    選擇 
        姓名,
        部門,
        薪水,
        等級()超過(按薪金desc按部門命令分區)為RNK
    來自員工
)
從rnk = 1中選擇 * * rnk; employees;

在每個部門找到最高的僱員。


使用窗口功能使復雜的分析查詢更加可讀性和高效。它們在大多數現代數據庫中都支持,例如PostgreSQL,SQL Server,BigQuery,Snowflake和Oracle(MySQL從版本8.0支持它們)。

基本上,如果您正在使用其他行的上下文進行分析,則窗口功能可能是正確的工具。

以上是如何在SQL中使用窗口函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1596
276
您如何計算SQL中兩個日期之間的差異? 您如何計算SQL中兩個日期之間的差異? Aug 02, 2025 pm 01:29 PM

要計算兩個日期之間的差值,需根據數據庫類型選擇相應函數:1.在MySQL中使用DATEDIFF()計算天數差,或TIMESTAMPDIFF()指定單位如HOUR、MINUTE;2.在SQLServer中使用DATEDIFF(date_part,start_date,end_date)並指定單位;3.在PostgreSQL中通過直接相減得到天數差,或使用EXTRACT(DAYFROMAGE(...))獲取更精確間隔;4.在SQLite中利用julianday()函數相減得出天數差;始終注意日期順序

SQL中的BLOB和CLOB數據類型是什麼? SQL中的BLOB和CLOB數據類型是什麼? Aug 07, 2025 pm 04:22 PM

BLOBstoresbinarydatalikeimages,audio,orPDFsasrawbyteswithoutcharacterencoding,whileCLOBstoreslargetextsuchasarticlesorJSONusingcharacterencodinglikeUTF-8andsupportsstringoperations;2.Bothcanhandleuptogigabytesofdatadependingonthedatabase,butperforman

用於多維聚合的SQL立方體和匯總 用於多維聚合的SQL立方體和匯總 Jul 29, 2025 am 12:28 AM

CUBE用於生成所有維度組合的聚合,適用於交叉分析;ROLLUP按層級逐步匯總,適合有層級關係的數據。 CUBE按Region、Product、Quarter生成8種組合的總計,而ROLLUP按Year、Month、Day逐層上卷生成年、月、日等層級匯總。 CUBE適合查看所有交叉維度結果,ROLLUP適合展示層級結構。使用時注意CUBE可能導致結果集爆炸,ROLLUP依賴字段順序。可通過GROUPING()函數識別匯總行,用COALESCE命名總計行提升可讀性。

與SQL中的運算符相比,運算符的存在如何? 與SQL中的運算符相比,運算符的存在如何? Aug 05, 2025 pm 01:08 PM

useexists forexistenceChecks,尤其是WithlargeorCorrecoredsubqueries and whennullvaluesarepresent,AsitStopsatthefirstthefirstmatchandhandhandlesnullssafely; usiseInformembersHipshipsagainstsmall,已知

您如何在SQL中授予和撤銷權限? 您如何在SQL中授予和撤銷權限? Aug 04, 2025 am 09:19 AM

GRANTandREVOKEstatementsareusedtomanageuserpermissionsinSQL.1.GRANTprovidesprivilegeslikeSELECT,INSERT,UPDATE,DELETE,ALTER,EXECUTE,orALLPRIVILEGESondatabaseobjectstousersorroles.2.SyntaxforgrantingisGRANTprivilege_typeONobject_nameTOuser_or_role,allo

通過查詢性能優化SQL訂單 通過查詢性能優化SQL訂單 Aug 04, 2025 am 11:19 AM

要優化SQL中ORDERBY的性能,首先要理解其執行機制並合理利用索引和查詢結構。當排序字段無索引時,數據庫會觸發“filesort”,消耗大量資源;因此應避免對大表直接排序,並通過WHERE條件減少排序數據量。其次,為排序字段建立匹配順序的索引,可大幅加速查詢,如在MySQL8.0 創建倒序索引提升效率。此外,深分頁(如LIMIT1000,10)應改用基於索引的游標分頁(如WHEREid>12345),以跳過無效掃描。最後,結合緩存、異步聚合等手段也可進一步優化大數據集場景下的排序性能。

如何在SQL中獲得一年中的第一天和最後一天? 如何在SQL中獲得一年中的第一天和最後一天? Aug 11, 2025 pm 05:42 PM

ThefirstdayoftheyearisobtainedbyconstructingortruncatingtoJanuary1stofthegivenyear,andthelastdayisDecember31stofthesameyear,withmethodsvaryingbydatabasesystem;2.Fordynamiccurrentyeardates,MySQLusesDATE_FORMATorMAKEDATE,PostgreSQLusesDATE_TRUNCorDATE_

如何在SQL中找到列的總和? 如何在SQL中找到列的總和? Aug 08, 2025 pm 05:54 PM

tofindthemofacolumninsql,usetheSum()函數,whoturnsthetthetaTaLnumericValuesInaspeCifiedColumnWhileIgnoringNulls; 1.UseBasicSyntax:selectsum(column_name)asaliasfromtable_name; 2.seletheletheletheetecoLumnHasnumerceLemercerectatoRorrorrorrorrorrorrorrorrorrorrorrorrorrorrorrorrorrorrorrorror;

See all articles