SQL SERVER的PARTITION BY應用場景

SQL SERVER的PARTITION BY關鍵字說明介紹

  • PARTITION BY關鍵字介紹
  • 具體使用場景
    • 排名計算
    • 累計求和
    • 分組求最值
    • 分組內百分比計算
    • 分組內移動平均計算
    • 分組內數據分布統計
    • 分組內數據偏移計算
  • 總結

PARTITION BY關鍵字介紹

在SQL SERVER中,關鍵字PARTITION BY主要用于窗口函數中,它能將查詢結果集按照指定的列或表達式劃分成多個分區(組),然后窗口函數會在每個分區內獨立地進行計算

通俗來講就是:它可以把結果集拆分成多個邏輯組,窗口函數會基于這些組來執行操作,而不是對整個結果集進行統一處理。這樣就能在每個分區內完成特定的計算比如排名、求和、求平均值

具體使用場景

假設存在一個 Sales 表,包含 Region(地區)、Salesperson(銷售人員)和 SalesAmount(銷售金額)列

排名計算

要在每個地區內為銷售人員按銷售金額進行排名

SELECT Region,Salesperson,SalesAmount,RANK() OVER (PARTITION BY Region ORDER BY SalesAmount DESC) AS SalesRank
FROM Sales;
--PARTITION BY Region:將結果集按照 Region 列的值進行分區,每個地區形成一個獨立的組。
--ORDER BY SalesAmount DESC:在每個地區分區內,按照 SalesAmount 列的值降序排序。
--RANK():為每個分區內的銷售人員計算排名。

累計求和

若要計算每個地區內銷售人員的累計銷售金額,可以使用 SUM() 窗口函數

SELECT Region,Salesperson,SalesAmount,SUM(SalesAmount) OVER (PARTITION BY Region ORDER BY Salesperson) AS CumulativeSales
FROM Sales;--PARTITION BY Region:按 Region 列的值對結果集進行分區。--ORDER BY Salesperson:在每個地區分區內,按照 Salesperson 列的值進行排序。--SUM(SalesAmount):在每個分區內計算累計銷售金額

分組求最值

在每個分組中找出最大值或最小值,例如有一個 Products 表,包含 Category(產品類別)、ProductName(產品名稱)和 Price(價格)列,要找出每個類別中價格最高的產品信息

SELECT Category,ProductName,Price
FROM (SELECT Category,ProductName,Price,ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Price DESC) AS rnFROM Products
) subquery
WHERE rn = 1;--這里先使用 PARTITION BY Category 將產品按類別分組,在每個類別分組內按照價格降序排列并為每行分配行號 rn,最后篩選出 rn = 1 的記錄,也就是每個類別中價格最高的產品

分組內百分比計算

計算每個分組內某一數值占該組總和的百分比。假設有一個 Orders 表,包含 Region(地區)和 OrderAmount(訂單金額)列,要計算每個地區的訂單金額占該地區訂單總金額的百分比

SELECT Region,OrderAmount,OrderAmount * 1.0 / SUM(OrderAmount) OVER (PARTITION BY Region) AS Percentage
FROM Orders;--PARTITION BY Region 把訂單按地區分組,SUM(OrderAmount) OVER (PARTITION BY Region) 計算每個地區的訂單總金額,然后用當前訂單金額除以該地區總金額得到百分比

分組內移動平均計算

在分組內計算移動平均值,常用于分析數據的趨勢。例如有一個 StockPrices 表,包含 StockSymbol(股票代碼)、TradeDate(交易日期)和 ClosingPrice(收盤價)列,要計算每個股票最近 3 天的移動平均收盤價。

SELECT StockSymbol,TradeDate,ClosingPrice,AVG(ClosingPrice) OVER (PARTITION BY StockSymbol ORDER BY TradeDate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAverage
FROM StockPrices;-- PARTITION BY StockSymbol 按股票代碼分組,ORDER BY TradeDate 按交易日期排序,ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 表示在當前行及前兩行的范圍內計算平均值,這樣就得到了每個股票最近 3 天的移動平均收盤價

分組內數據分布統計

統計每個分組內不同數據區間的分布情況。比如有一個 Students 表,包含 Class(班級)和 Score(分數)列,要統計每個班級中不同分數段(如 0 - 59、60 - 79、80 - 100)的學生數量

SELECT Class,CASE WHEN Score BETWEEN 0 AND 59 THEN '0 - 59'WHEN Score BETWEEN 60 AND 79 THEN '60 - 79'WHEN Score BETWEEN 80 AND 100 THEN '80 - 100'END AS ScoreRange,COUNT(*) OVER (PARTITION BY Class, CASE WHEN Score BETWEEN 0 AND 59 THEN '0 - 59'WHEN Score BETWEEN 60 AND 79 THEN '60 - 79'WHEN Score BETWEEN 80 AND 100 THEN '80 - 100'END) AS StudentCount
FROM Students;--先通過 CASE 語句將分數劃分成不同區間,然后使用 PARTITION BY Class, ScoreRange 按班級和分數段分組,COUNT(*) 統計每個分組內的學生數量

分組內數據偏移計算

計算每個分組內當前行與前一行或后一行數據的差值等偏移量。例如有一個 SalesData 表,包含 Product(產品)、Month(月份)和 SalesVolume(銷售數量)列,要計算每個產品每月銷售數量相較于前一個月的增長數量

SELECT Product,Month,SalesVolume,SalesVolume - LAG(SalesVolume) OVER (PARTITION BY Product ORDER BY Month) AS Growth
FROM SalesData;--PARTITION BY Product 按產品分組,ORDER BY Month 按月份排序,LAG(SalesVolume) 函數獲取當前行前一行的銷售數量,用當前行銷售數量減去前一行的銷售數量得到增長數量

總結

PARTITION BY 關鍵字讓你可以在結果集的各個分組內執行復雜的計算,而不必對整個結果集進行統一處理。這在處理分組統計、排名、累計計算等場景時非常有用,能大大提升查詢的靈活性和表達能力

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

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

相關文章

NO.18十六屆藍橋杯備戰|循環嵌套|乘法表|斐波那契|質數|水仙花數|(C++)

循環嵌套 循環嵌套的使? while , do while , for ,這三種循環往往會嵌套在?起才能更好的解決問題,就是我們所說的:循環嵌套。這三種循環都可以任意嵌套使? ?如: 寫?個代碼,打印?個乘法?…

leetcode - hot100 - python - 專題一:哈希

1、兩數之和 簡單 題目: 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。你可…

JavaEE-SpringBoot快速入門

文章目錄 本節目標Maven什么是Maven創建一個Maven項目maven項目功能maven的依賴管理全球倉庫, 私服, 本地服務器, 配置國內鏡像 第一個SpringBoot項目創建項目運行SpringBoot程序 SpringBoot原理初步Web服務器 總結 本節目標 了解什么是maven, 配置國內源使用Springboot創建項…

【Viper】配置格式與支持的數據源與go案例

Viper 是一個用于 Go 應用程序的配置管理庫,支持多種配置格式和數據源。 安裝依賴 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要寫在etcd客戶端import里 1…

【C/C++】后綴表達式 藍橋杯/ACM備賽

核心考點:1.棧的應用 2.字符串處理 題目描述 所謂后綴表達式是指這樣的一個表達式:式中不再引用括號,運算符號放在兩個運算對象之后,所有計算按運算符號出現的順序,嚴格地由左而右新進行(不用考慮運算符的…

【AI實踐】deepseek支持升級git

當前Windows 11 WSL的git是2.17,Android Studio提示需要升級到2.19版本 網上找到指導文章 安裝git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

QEMU 搭建 Ubuntu x86 虛擬機

1. 安裝 QEMU 在 Ubuntu 系統中,可以通過以下命令安裝 QEMU: sudo apt-get update sudo apt-get install qemu-system-x86_64 qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager2. 創建虛擬硬盤鏡像 qemu-img create -f raw ubuntu…

Linux驅動層學習:Linux 設備樹

設備樹是一種數據結構,包含多個節點,用于描述硬件設備及其配置信息,它通常用于嵌入式系統中,尤其是在Linux操作系統中,幫助操作系統識別和管理硬件資源,設備樹不是代碼,而是一種用數據描述硬件信…

金蝶云星空與釘釘高效數據集成案例分享

金蝶云星空數據集成到釘釘的技術案例分享 在企業信息化系統中,數據的高效流動和實時反饋是提升業務效率的關鍵。本文將聚焦于一個具體的系統對接集成案例:如何將金蝶云星空的數據集成到釘釘,并實現審核狀態的回傳提示。 本次集成方案名為“…

圖形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan簡介

1.Skia —— 2D 圖形庫 Skia 是一個 2D 圖形庫,它的作用是為開發者提供一個高層次的繪圖接口,方便他們進行 2D 圖形渲染(比如繪制文本、形狀、圖像等)。Skia 本身不直接管理 GPU 或進行底層的渲染工作,而是通過 底層圖…

GIT提錯分支,回滾提交

1. 準備示例 假設我們有三次提交: test1:需要在 master 分支提交test2、test3:需要在 develop 分支提交 遠端線上記錄 2. 步驟 選擇需要回退的記錄: 選中需要回退的 commit,選擇 Reset Current Branch to Here...。…

【原創】在ubuntu中搭建gradle開發環境

檢查Linux版本 rootwww:~# hostnamectlStatic hostname: www.0x88.comIcon name: computer-vmChassis: vmMachine ID: 30fa955a36be492ca459599ef20bc508Boot ID: 37084dbe36f44adaa075e8f9a98f132eVirtualization: kvm Operating System: Ubuntu 22.04.5 LTSKernel: Linux 5.…

【JavaEE進階】MyBatis入門

目錄 🌴前言 🌲什么是MyBatis? 🌳準備工作 🚩創建工程 🚩配置數據庫連接字符串 🚩數據準備 🚩編寫持久層代碼 🍃單元測試 🌴前言 在應?分層學習時,我們了解到…

以太網詳解(八)傳輸層協議:TCP/UDP 協議

文章目錄 傳輸層協議概述為什么需要傳輸層?傳輸層功能網絡層與傳輸層在實現 “端到端” 傳輸的異同兩類服務:面向連接/無連接服務 傳輸控制協議 TCPTCP 協議數據單元格式TCP 的重傳機制快重傳和快恢復快重傳舉例快恢復算法 用戶數據報協議 UDPUDP 概述UDP 基本工作過…

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔 本文將對七個流行的定時任務調度庫:node-cron、rxjs、bull、node-schedule、agenda、bree、cron。這些庫都可以用來處理定時任務,但它們的特點和適用場景有所不同。我們將從…

DeepSeek 開放平臺無法充值 改用其他平臺API調用DeepSeek-chat模型方法

近幾天DeepSeek開放平臺無法充值目前已經關閉狀態,大家都是忙著接入DeepSeek模型 ,很多人想使用DeepSeek怎么辦? 當然還有改用其他平臺API調用方法,本文以本站的提供chatgpt系統為例,如何修改DeepSeek-chat模型API接口…

pix2text 使用經驗

給同行打雞血 😊 構建結構化的數理領域知識庫: 提高可訪問性和可搜索性 Markdown和LaTeX格式:這兩種格式易于在線發布和共享,有助于提高數學內容的可訪問性。搜索引擎優化:將PDF內容轉換為標記語言,可以…

Linux(centos)系統安裝部署MySQL8.0數據庫(GLIBC版本)

安裝前檢查服務器glibc版本,下載對應版本包 rpm -qa | grep glibc mysql安裝包及依賴包已整理好,下載地址:https://pan.quark.cn/s/3137acc814c0,下載即可安裝 一、下載MySQL mysql安裝包及依賴包已整理好,下載地址…

6.2.圖的存儲結構-鄰接矩陣法

一.鄰接矩陣法存儲不帶權圖: 結點不帶權值: 1.左圖的無向圖中,A到B直達的有一條路,所以A行B列的值為1; 左圖的無向圖中,A到F沒有直達的路,所以A行F列的值為0; 結論:無…

【VB語言】EXCEL中VB宏的應用

【VB語言】EXCEL中VB宏的應用 文章目錄 [TOC](文章目錄) 前言一、EXCEL-VB1.實驗過程2.代碼 二、EXCEL-VB 生成.c.h文件1.實驗過程2.代碼 四、參考資料總結 前言 1.WPS-VB擴展包 提示:以下是本篇文章正文內容,下面案例可供參考 一、EXCEL-VB 1.實驗過…