SQL 常用 OVER() 窗口函數介紹

1. sum() + over()? 做組內數據累加

? ? ? ?在 SQL 中想實現不同分組內數據累加,可以通過?sum() + over()?+?PARTITION BY + ORDER BY? 結合實現。這種方式能同時滿足多維度分組且組內累加的需求,示例如下:

假設我們有一張?sales?表,表中存儲著不同區域、不同產品的每日銷售額,數據如下:

sale_idregionproductsale_dateamount
1華北手表2023-10-021000
2華北手表2023-10-031500
3華北平板2023-10-023000
4華東手表2023-10-033000
5華東手表2023-10-033500
6華東平板2023-10-034000

需求:按?region(區域)和?product(產品)分組,在每個分組內按時間順序累加金額。

實現方法:SUM()+OVER()+PARTITION BY+ORDER BY

SELECT sale_id,region,product,sale_date,amount,-- 按區域和產品分組,組內按日期排序累加金額SUM(amount) OVER (PARTITION BY region, product  -- 多列分組:區域+產品ORDER BY sale_date            -- 組內按日期排序ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 累加范圍:從組內第一條到當前行) AS cumulative_amount
FROM sales
ORDER BY region, product, sale_date;

結果:

sale_id | region  | product | sale_date  | amount | cumulative_amount
---------|---------|---------|------------|--------|------------------
1       | 華北    | 手表    | 2023-10-02 | 1000   | 1000     -- 華北手表:1000
2       | 華北    | 手表    | 2023-10-02 | 1500   | 2500     -- 華北手表:1000+1500
3       | 華北    | 手表    | 2023-10-03 | 3000   | 5500     -- 華北手表:1000+1500+3000
4       | 華東    | 手表    | 2023-10-03 | 3500   | 9000     -- 華東手表:1000+1500+3000+3500
5       | 華東    | 平板    | 2023-10-02 | 3000   | 3000     -- 華東平板:3000
6       | 華東    | 平板    | 2023-10-03 | 4000   | 7000     -- 華東平板:3000+4000

?關鍵語法:?

? 1. PARTITION BY col1, col2:按多列組合進行分組,所有列相同的數據會被分到同一組。

? 2. ORDER BY:指定組內的排序規則,決定累加的順序。

? ? ? 3.? 窗口函數支持所有主流數據庫(MySQL 8.0+、PostgreSQL、Kingbase、Orecle 等)

2. OVER() 窗口函數介紹

? ? ? ?SELECT? sale_id, region, product, sale_date,??amount, SUM(amount) OVER (
PARTITION BY region, product? ?ORDER BY sale_date??
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_amount? FROM sales ORDER BY region, product, sale_date;

? ? ? ? 在上面的 sql 中,OVER()窗口函數核心語法是定義一個數據窗口,可以理解為定義組內其它數據與當前行處理邏輯,例如上面 sql 的邏輯是,同一個分組內從第一行開始將數據累加到當前行。? ? ? ? ?注意:上面 sql 看似與?GROUP BY?處理相同,其實所有區別,窗口函數不會將多行數據合并為一行,而是在原有行的數據基礎上為每行添加一個計算結果。

? ? ?2.1?基本使用語法
函數名(列名) OVER (窗口定義)

? ? ? ? 1.?函數名:可以是聚合函數(SUMCOUNTAVG?等)或專用窗口函數(ROW_NUMBERRANKDENSE_RANK?等)。

? ? ? ? 2. 窗口定義:通過?PARTITION BYORDER BY?等子句定義數據窗口對數據處理范圍和規則。

? ? 2.2? 關鍵字說明

? ? ? ? 1.?PARTITION BY:?分組劃分規則(可選),將數據按指定列分組,每個分組形成一個獨立的空間,函數只在組內計算。

SELECT sale_date,region,amount,SUM(amount) OVER (PARTITION BY region ORDER BY sale_date) AS 區域累計銷售額
FROM sales;

? ? ? ? 2.?ORDER BY:窗口內排序(可選),指定窗口內數據的排序規則

SELECT sale_date,amount,SUM(amount) OVER (ORDER BY sale_date) AS 全局累計銷售額
FROM sales;

? ? ? ?3. 處理邏輯范圍(可選),通過?ROWS?或?RANGE?精確指定窗口包含的行范圍(默認是從組內第一行到當前行):

? ? 3.1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW :從組內第一行到當前行

? ? 3.2 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING :從當前行到組內最后一行

? ? 3.3 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ;當前行、前一行、后一行(共 3 行)

SELECT sale_date,amount,AVG(amount) OVER (ORDER BY sale_date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS 近3行平均值
FROM sales;

3. 常見使用場景

? 3.1??累計求和 / 平均值(聚合函數 +OVER()
SELECT id,amount,-- 累計求和SUM(amount) OVER (ORDER BY id) AS 累計金額,-- 移動平均值(前1行+當前行+后1行)AVG(amount) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS 移動平均
FROM sales;
3.2?組內排名(ROW_NUMBER/RANK/DENSE_RANK
SELECT region,amount,-- 組內按金額排名(不重復)ROW_NUMBER() OVER (PARTITION BY region ORDER BY amount DESC) AS 排名_不重復,-- 組內按金額排名(允許并列,跳過后續名次)RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS 排名_跳號,-- 組內按金額排名(允許并列,不跳過后續名次)DENSE_RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS 排名_連續
FROM sales;
3.3?組內首尾值 / 占比
SELECT region,amount,-- 組內最大金額MAX(amount) OVER (PARTITION BY region) AS 區域最高金額,-- 當前金額占組內總金額的比例amount / SUM(amount) OVER (PARTITION BY region) AS 區域占比
FROM sales;

與?GROUP BY?的區別

特性GROUP BYOVER()?窗口函數
結果行數每組返回一行保留原表所有行
計算范圍整組數據可自定義窗口范圍(如前 N 行)
適用場景統計各組匯總值需保留明細行的分析場景

總結

OVER()?函數的核心價值是:在不減少原表行數的前提下,實現對 "相關數據組" 的靈活計算,特別適合需要同時展示明細數據和聚合分析結果的場景(如報表中的累計占比、排名、移動平均等)。

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

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

相關文章

OpenRouter:一站式 AI 模型調用平臺,免費暢享千問、DeepSeek 等頂級模型

歡迎來到我的博客,代碼的世界里,每一行都是一個故事🎏:你只管努力,剩下的交給時間 🏠 :小破站 OpenRouter:一站式 AI 模型調用平臺,免費暢享千問、DeepSeek 等頂級模型前…

SpringBoot 整合 Kafka 的實戰指南

引言: 本文總字數:約 9800 字預計閱讀時間:40 分鐘 為什么 Kafka 是高吞吐場景的首選? 在當今的分布式系統中,消息隊列已成為不可或缺的基礎設施。面對不同的業務場景,選擇合適的消息隊列至關重要。目前…

OpenCV 實戰篇——如何測算出任一副圖片中的物體的實際尺寸?傳感器尺寸與像元尺寸的關系?

文章目錄1 如何測算出任一副圖片中的物體的實際尺寸2 傳感器尺寸與像元尺寸的關系3 Max Frame Rate最大幀率4 為什么要進行相機標定?相機標定有何意義?5 基于相機模型的單目測距--普通相機1 如何測算出任一副圖片中的物體的實際尺寸 物體尺寸測量的思路是找一個確定尺寸的物…

Java并發鎖相關

鎖相關 ?1. 什么是可重入鎖?Java 中如何實現??? ?答?: 可重入鎖允許一個線程多次獲取同一把鎖(即遞歸調用時無需重新競爭鎖)。 ?關鍵點?:防止死鎖,避免線程因重復請求已持有的鎖而阻塞。…

Pie Menu Editor V1.18.7.exe 怎么安裝?詳細安裝教程(附安裝包)?

??Pie Menu Editor V1.18.7.exe? 是一款用于創建和編輯 ?餅圖菜單(Pie Menu)?? 的工具軟件,通常用于游戲開發、UI設計、3D建模(如 Blender 等)、或自定義軟件操作界面。 一、準備工作 ?下載文件? 下載了 ?Pi…

基于Spark的中文文本情感分析系統研究

引言 1.1 研究背景與意義 隨著互聯網的普及和社交媒體的興起、特別是自媒體時代的來臨,網絡文本數據呈現爆炸式增長。這些文本數據蘊含著豐富的用戶情感信息,如何有效地挖掘和利用這些信息,對于了解輿情動態、改進客戶服務、輔助決策分析具…

Simulink子系統、變體子系統及封裝知識

1.引言 文章三相新能源并網系統序阻抗模型——序阻抗分析器IMAnalyzer介紹了一種用于分析和掃描序阻抗的軟件。其中,在序阻抗掃頻操作過程中,用到了一個擾動注入、測量和運算工具【IMtool】,它外表長這樣: 內部長這樣&#xff1a…

高階組件介紹

高階組件約定俗成以with開頭 import React, { useEffect } from react; import { TouchableOpacity, Image, StyleSheet } from react-native;type IReactComponent React.ClassicComponentClass| React.ComponentClass| React.FunctionComponent| React.ForwardRefExoticComp…

C++ STL系列-02.泛型入門

C STL系列-02.泛型入門C中的泛型編程主要通過模板(template)實現。模板允許我們編寫與類型無關的代碼,是一種將類型作為參數進行編程的方式。在C中,模板分為函數模板和類模板。 1. 函數模板函數模板允許我們定義一個函數&#xff…

高效管理網絡段和端口集合的工具之ipset

目錄 1. 核心命令速查 2. 集合類型 3. 實戰案例:使用 ipset 封禁 IP 案例 1:基礎黑名單封禁(手動添加) 案例 2:自動過期和解封 案例 3:封禁 IP 和端口組合 案例 4:白名單模式 案例 5&am…

實例和對象的區別

對象(Object)是一個概念,它表示“某個類的一個成員”,是“邏輯上的個體”。實例(Instance)是一個現實,指的是在內存中真正分配了空間的對象。實例一定是對象,但對象不一定是實例。例…

Win10 Chrome認不出新Emoji?兩個擴展搞定顯示與輸入

前言 用Win10電腦在Chrome里發消息、刷網頁時,你是否遇到過這樣的尷尬:別人發的、或者頁面顯示的 Emoji,在你屏幕上變成了空白方框,像“文字里缺了一塊拼圖”?其實這不是Chrome的錯,也不用換電腦&#xff0…

Golang中逃逸現象, 變量“何時棧?何時堆?”

目錄 什么是棧 什么是堆 棧 vs 堆(核心區別) GO編譯器的逃逸分析 什么是逃逸分析? 怎么看逃逸分析結果? 典型“會逃逸”的場景 閉包捕獲局部變量 返回或保存帶有“底層存儲”的容器 經由接口/反射/fmt 等導致裝箱或被長…

MySQL入門指南:從安裝到工作原理

什么是MySQL MySQL是一個開源的關系型數據庫管理系統,由瑞典MySQL AB公司開發(目前屬于Oracle公司),被廣泛地應用在大中小型網站中 MySQL是一個小型的開源的關系型數據庫管理系統,與其他大型數據庫管理系統例如&…

dask.dataframe.shuffle.set_index中獲取 divisions 的步驟分析

dask.dataframe.shuffle.set_index 中獲取 divisions 的步驟分析 主要流程概述 在 set_index 函數中,當 divisionsNone 時,系統需要通過分析數據來動態計算分區邊界。這個過程分為以下幾個關鍵步驟: 1. 初始檢查和準備 if divisions is None:…

ai生成ppt工具有哪些?10款主流AI生成PPT工具盤點

隨著人工智能技術的飛速發展,AI生成PPT工具逐漸成為職場人士、學生和創作者提升效率的得力助手。這類工具通過智能算法,能夠快速將文本、數據或創意轉化為結構化、視覺化的演示文稿,大幅節省設計時間。1、AiPPT星級評分:★★★★★…

Qt多線程編程學習

Qt多線程編程學習 1. 項目概述 本項目展示了Qt中多線程編程的基本用法,通過繼承QThread類創建自定義線程,并演示了線程的啟動、執行和銷毀過程。項目包含一個簡單的用戶界面,用戶可以通過按鈕控制線程的啟動和結束。 1.1 項目結構 項目包含以…

加密貨幣武器化:惡意npm包利用以太坊智能合約實現隱蔽通信

ReversingLabs研究人員發現兩個惡意npm包利用以太坊(Ethereum)智能合約隱藏并傳播惡意軟件。這兩個名為colortoolsv2和mimelib2的軟件包于2025年7月被識別,展現了開源安全攻防戰中的新戰術。惡意軟件包偽裝成實用工具攻擊活動始于7月7日發布的…

Spring Boot 全局字段處理最佳實踐

在日常開發中,我們總會遇到一些瑣碎但又無處不在的字段處理需求:? 請求處理: 用戶提交的表單,字符串前后帶了多余的空格,需要手動 trim()。? 響應處理: 返回給前端的 BigDecimal 金額,因為精度問題導致JS處理出錯&am…

三坐標測量機在汽車制造行業中的應用

在汽車制造業中,零部件精度決定著整車性能。從發動機活塞的微米級公差,到車身焊接的毫米級間隙,汽車制造“差之毫厘,謬以千里” ,任何細微偏差都可能引發連鎖反應:發動機抖動、異響、油耗飆升,車…