SQL關鍵字三分鐘入門:ROW_NUMBER() —— 窗口函數為每一行編號

在進行數據分析時,我們常常需要為查詢結果集中的每條記錄生成一個唯一的序號或行號。例如:

  • 為每位員工按照入職時間排序并編號;
  • 按照訂單金額對訂單進行排序,并給每個訂單分配一個順序編號;
  • 在分組數據內為每條記錄編號。

這時候就需要使用 SQL 中非常有用的窗口函數 —— ROW_NUMBER()

它可以幫助我們輕松地為查詢結果集中的每一行分配一個獨一無二的行號,特別適合處理涉及排序和分組的數據分析任務。


?什么是 ROW_NUMBER()?

ROW_NUMBER() 是 SQL 中用于為分區或整個結果集中的行生成唯一行號的窗口函數。它會根據指定的排序規則為每條記錄分配一個連續的行號,即使存在相同的值也不會導致行號跳過。

你可以把它理解為:“按照某個標準給每條記錄打上獨一無二的行號標簽”。


?基本語法

SELECT column1, column2, ..., 
ROW_NUMBER() OVER ([PARTITION BY partition_column]ORDER BY sort_column [ASC|DESC], ...
) AS row_num
FROM table_name;
  • PARTITION BY(可選):定義如何將數據劃分為不同的分區(類似于?GROUP BY),每個分區獨立進行編號。
  • ORDER BY:指定用于決定行號順序的列及其方向(升序或降序)。

?示例講解

假設我們有一個 employees 表,記錄了員工的信息:

employee_idnamehire_date
1張三2020-06-01
2李四2019-05-23
3王五2021-07-15
4趙六2020-08-10
5孫七2018-03-12

?示例1:按入職日期為所有員工編號

SELECT name, hire_date,
ROW_NUMBER() OVER (ORDER BY hire_date ASC) AS row_num
FROM employees;
結果:
namehire_daterow_num
孫七2018-03-121
李四2019-05-232
張三2020-06-013
趙六2020-08-104
王五2021-07-155

?注意:這里我們按入職日期進行了升序排列,并為每位員工分配了一個連續的行號。


?示例2:按部門對員工進行編號(使用 PARTITION BY)

假設我們增加了一個 department 列來表示員工所屬的部門:

employee_idnamedepartmenthire_date
1張三銷售部2020-06-01
2李四銷售部2019-05-23
3王五技術部2021-07-15
4趙六技術部2020-08-10
5孫七銷售部2018-03-12
SELECT name, department, hire_date,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date ASC) AS row_num
FROM employees;
結果:
namedepartmenthire_daterow_num
孫七銷售部2018-03-121
李四銷售部2019-05-232
張三銷售部2020-06-013
王五技術部2021-07-151
趙六技術部2020-08-102

?這里我們按部門進行了劃分,然后在每個部門內部根據入職日期進行編號。


?示例3:結合其他聚合函數使用

有時候你可能還需要同時計算一些匯總信息,比如總人數、平均入職年限等。下面的例子展示了如何同時顯示編號和部門總人數:

SELECT name, department, hire_date,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date ASC) AS row_num,
COUNT(*) OVER (PARTITION BY department) AS total_employees_in_dept
FROM employees;
結果:
namedepartmenthire_daterow_numtotal_employees_in_dept
孫七銷售部2018-03-1213
李四銷售部2019-05-2323
張三銷售部2020-06-0133
王五技術部2021-07-1512
趙六技術部2020-08-1022

注意

對比項使用建議
唯一行號即使有相同的排序值,ROW_NUMBER()?也會為每條記錄分配一個唯一的行號
不同的排名函數-?RANK():允許并列排名,但會導致行號跳躍
-?DENSE_RANK():與?RANK()?類似,但不會跳過行號
性能優化盡量減少?PARTITION BY?的范圍以提高性能
數據一致性在執行復雜的編號操作時,確保數據的一致性和準確性

?總結對比表

場景SQL 示例
按單一條件編號SELECT ..., ROW_NUMBER() OVER (ORDER BY hire_date ASC) AS row_num FROM employees;
按部門內條件編號SELECT ..., ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date ASC) AS row_num FROM employees;
結合其他聚合函數使用SELECT ..., ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date ASC) AS row_num, COUNT(*) OVER (PARTITION BY department) AS total_employees_in_dept FROM employees;

希望這篇簡短的指南幫助你快速了解了 ROW_NUMBER() 窗口函數的強大功能。

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

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

相關文章

微信小程序如何實現通過郵箱驗證修改密碼功能

基于騰訊云開發(Tencent Cloud Base)實現小程序郵箱驗證找回密碼功能的完整邏輯說明及關鍵代碼實現。結合安全性和開發效率,方案采用 ??云函數 小程序前端?? 的架構,使用 ??Nodemailer?? 發送郵件。Nodemailer 是一個專為…

C# VB.NET中Tuple輕量級數據結構和固定長度數組

C# VB.NET取字符串中全角字符數量和半角字符數量-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148871910 在VB.NET中,使用Tuple和固定長度數組在性能上有細微差異,以下是詳細分析: 性能對比測試 通過測試 100 萬次調用&am…

建筑物年代預測與空間異質性分析解決方案

建筑物年代預測與空間異質性分析解決方案 1. 問題分析與創新點設計 核心任務:預測建筑物建造年代,并分析空間異質性對預測的影響 創新點設計: 空間權重矩陣集成:構建空間鄰接矩陣量化地理鄰近效應多尺度特征提取:融合建筑物微觀特征與街區宏觀特征異質性分區建模:基于…

FOUPK3system5XOS

Foupk3systemX5OS系統19.60內測版(X9)2023年4月16日正式發布 1.0Foupk3systemX5OS系統19.60(X9)2024年10月6日發布 Foupk3systemX5OS系統19.60增強版(X9X5)2024年10月6日發布Foupk3systemX5OS系統19.60正…

隨機生成的亂碼域名”常由**域名生成算法(DGA)** 產生

“隨機生成的亂碼域名”常由**域名生成算法(DGA)** 產生,是網絡攻擊(尤其是僵尸網絡、惡意軟件控制場景 )中躲避檢測的手段,以下是關鍵解析: ### 一、本質與產生邏輯 亂碼域名是攻擊者利用 **DG…

Solidity學習 - 繼承

文章目錄 前言繼承的基本概念繼承的基本用法單繼承實現函數重寫(overriding) 構造函數的繼承處理多重繼承抽象合約 前言 繼承是面向對象編程中的核心概念之一,Solidity作為一種面向對象的智能合約語言,同樣支持繼承機制。通過繼承…

依賴注入(Dependency Injection, DI)的核心概念和解決的核心問題

核心概念: 依賴注入是一種設計模式,也是實現控制反轉(Inversion of Control, IoC) 原則的一種具體技術。其核心思想是: 解耦: 將一個類(客戶端)所依賴的其他類或服務(依…

Reactor Schedulers

Reactor 是一個基于響應式編程的庫,它提供了豐富的調度器(Schedulers)機制,用于管理異步操作的執行環境。Schedulers 是 Reactor 中的核心組件之一,它們允許開發者靈活地控制操作符和訂閱操作在哪個線程上執行&#xf…

設備樹引入

一、設備樹的基本知識 1、什么是設備樹?為什么會有設備樹? 2011年,Linux之父Linus Torvalds發現這個問題后,就通過郵件向ARM-Linux開發社區發了一封郵件,不禁的發出了一句“This whole ARM thing is a f*cking pain i…

【數據標注師】3D標注

目錄 一、 **3D標注知識體系框架**二、 **五階能力培養體系**? **階段1:空間認知筑基(2-3周)**? **階段2:核心標注技能深化**? **階段3:復雜場景解決方案**? **階段4:領域深度專精? **階段5&#xff1…

華為HN8145V光貓改華為藍色公版界面,三網通用,xgpon公版光貓

咸魚只賣20多元一個,還是xgpon的萬兆貓,性價比不錯哦 除了沒有2.5G網口,其他還行。 改成公版光貓后,運營商是無法納管光貓,無法后臺修改光貓數據及超密。 華為 HN8145V 光貓具有以下特點: 性能方面 高速接…

【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法二)定長滑動窗口+數組

Problem: 438. 找到字符串中所有字母異位詞 題目:給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法一&…

PAC 學習框架:機器學習的可靠性工程

PAC(Probably Approximately Correct) 是機器學習理論的核心框架,用于量化學習算法的可靠性。它回答了一個關鍵問題: “需要多少訓練樣本,才能以較高概率學到一個近似正確的模型?” 一、PAC 名稱拆解 術語…

嵌入式C語言數組:數組/字符數組

1. 數組 1.1 一維數組 數組是一串連續的地址; 數組名是地址常量,代表數組的起始地址; sizeof(數組名) 可得出數組的總內存空間; C 語言對數組不做越界檢查,使用時應注意; 數組不…

變長字節的數字表示法vb224

開始 數字有大有小,用多少字節表示呢? 本文描述的方案,采用變化的長度。vb是varying bytes的意思,224是表示它特征的一個數。 第一版: 每個字節8比特,最高的1比特用來表示“是否連續”,0表示…

ByteMD+CozeAPI+Coze平臺Agent+Next搭建AI輔助博客撰寫平臺(邏輯清楚,推薦!)

背景: 現在主流的博客平臺AI接入不夠完善,如CSDN接入的AI助手不支持多模態數據的交互、稀土掘金的編輯器AI功能似乎還沒能很好接入(哈哈哈,似乎在考慮布局什么?) 痛點分析: 用戶常常以截圖的形式…

【數據標注師】關鍵詞標注

目錄 一、 **理解關鍵詞標注的核心邏輯**1. **三大標注原則**2. **關鍵詞類型體系** 二、 **四階訓練體系**? **階段1:基礎規則內化**? **階段2:語義濃縮訓練**? **階段3:場景化標注策略**? **階段4:工具效率提升** 三、 **五…

for each循環語句

for each循環語句 for each.....nextFor Each 的案例 for each…next 1、循環對象合集 worksheets workbooks range range("區域")selection (選中的區域)usedrange或者currentregion 返回的單元格區域格式: for each 變量名 in 對象集合(范圍)循環內容…

基于LQR控制器的六自由度四旋翼無人機模型simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 5.參考文獻 6.完整工程文件 1.課題概述 四旋翼無人機因其結構簡單、機動性強和成本低廉等特點,在航拍測繪、物流運輸、災害救援等領域得到廣泛應用。六自由度(3維平移3維旋轉&#xff0…

vftp centos 離線部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一鍵安裝配置vsftpd腳本(開放根目錄,禁用chroot)# 安裝vsftpd RPM包 echo "正在安裝vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …