MySQL使用窗口函數ROW_NUMBER()、DENSE_RANK()查詢每組第一名或每組前幾名,窗口函數使用詳解

MySQL數據表結構

創建 tbl_class_info 表,表中有四個字段 id、username、score、group_name

使用?ROW_NUMBER()、DENSE_RANK() 查詢每組前三名

-- 查詢每組前3名
SELECT username, score, group_name  
FROM (  SELECT username, score, group_name,  ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_rank,DENSE_RANK() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_dense_rank  FROM tbl_class_info 
) AS ranked_scores  
WHERE test_rank <= 3 OR test_dense_rank <= 3

查詢結果:

使用?ROW_NUMBER()、DENSE_RANK() 查詢第二名

-- 查詢每組第2名
SELECT username, score, group_name  
FROM (  SELECT username, score, group_name,  ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_rank FROM tbl_class_info 
) AS ranked_scores  
WHERE test_rank = 2

查詢結果:

使用 ROW_NUMBER()、DENSE_RANK() 查詢結果是不同的,

ROW_NUMBER()和DENSE_RANK()是常見的窗口函數,它們可以用于對結果集中的行進行排序和編號,它們的主要區別在于?使用DENSE_RANK()函數為每個組(group_name)中的記錄根據成績(score)降序排列,并為每組中的行分配一個唯一的序號(rank

與ROW_NUMBER()不同,如果存在相同的成績,DENSE_RANK()會為它們分配連續的序號,而不會跳過任何數字。下面是實例說明:

ROW_NUMBER()、DENSE_RANK() 區別詳解

使用ROW_NUMBER()查詢數據:

SELECTusername,score,group_name,ROW_NUMBER() OVER (PARTITION BY group_name
ORDER BYscore DESC) AS rank_number
FROMtbl_class_info;

執行結果可以看到,即使成績(score)相同,rank_number 序號也是不同的

使用 DENSE_RANK() 查詢數據:

SELECTusername,score,group_name,DENSE_RANK() OVER (PARTITION BY group_name
ORDER BYscore DESC) AS rank_number
FROMtbl_class_info;

執行結果可以看到,即使成績(score)相同,rank_number 序號也是相同的

所以總的來說,ROW_NUMBER() 和 DENSE_RANK() 都是非常有用的窗口函數,它們可以用于各種數據分析任務。但是,它們之間的區別意味著它們適用于不同的場景。如果您需要為每個行分配唯一的數字,即使在有重復值的情況下也是如此,那么 ROW_NUMBER() 是更好的選擇。如果您需要為每個行分配唯一的數字,但如果有重復值,則需要跳過重復值,那么 DENSE_RANK() 是更好的選擇。

MySQL窗口函數的使用語法

SELECT <窗口函數> OVER ([PARTITION BY <表達式>][ORDER BY <表達式>][ROWS BETWEEN <表達式> AND <表達式>]
)
FROM <表名>

?其中:?

  • <窗口函數> ?是窗口函數的名稱。?
  • PARTITION BY <表達式> ?是分區表達式。分區表達式用于將表中的行分成多個分區。?
  • ORDER BY <表達式> ?是排序表達式。排序表達式用于對分區中的行進行排序。?
  • ROWS BETWEEN <表達式> AND <表達式> ?是行范圍表達式。行范圍表達式用于指定窗口函數計算的行的范圍。
SELECTgroup_name,AVG(score) OVER (PARTITION BY group_name
ORDER BYscore DESC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS avg_sales
FROMtbl_class_info;

執行結果:

注:在窗口函數中,ROWS BETWEEN <表達式> AND <表達式> 用于指定窗口的邊界范圍。這個范圍是根據指定的表達式來確定的。通常,第一個表達式指定了窗口的起始行,第二個表達式指定了窗口的結束行。

在計算窗口函數之前,數據庫會先確定窗口的范圍。然后,根據指定的窗口范圍,對范圍內的行進行運算。通常,窗口函數會對窗口內的每一行執行計算,并返回一個與窗口范圍相對應的結果。
?

MySQL中常見的窗口函數有哪些

? SUM()函數:計算指定列的總和。

SELECT column1, SUM(column2) OVER (PARTITION BY column1) AS total_sum  
FROM table;

? AVG()函數:計算指定列的平均值。

SELECT column1, AVG(column2) OVER (PARTITION BY column1) AS average_value ?
FROM table;

? MIN()函數:返回指定列的最小值。

SELECT column1, MIN(column2) OVER (PARTITION BY column1) AS minimum_value ?
FROM table;

? MAX()函數:返回指定列的最大值。

SELECT column1, MAX(column2) OVER (PARTITION BY column1) AS maximum_value ?
FROM table;

? COUNT()函數:計算指定列的非空值的數量。

SELECT column1, COUNT(column2) OVER (PARTITION BY column1) AS count_value ?
FROM table;

? RANK()函數:返回一組行的排名。

SELECT column1, RANK() OVER (ORDER BY column2 DESC) AS rank_value ?
FROM table;

? DENSE_RANK()函數:返回一組行的不間斷排名。

SELECT column1, DENSE_RANK() OVER (ORDER BY column2 DESC) AS dense_rank_value ?
FROM table;

? ROW_NUMBER()函數:為一組行分配一個唯一的數字。

SELECT column1, ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2 DESC) AS row_number_value ?
FROM table;

MySQL窗口函數和聚合函數的區別

窗口函數和聚合函數都是在數據庫中對數據進行計算的函數。但是,它們之間有一些關鍵區別。?

  • 窗口函數返回一個單個值,該值是基于一組行計算的。這組行稱為窗口。窗口函數可以使用窗口中的所有行,也可以使用窗口中的部分行。?
  • 聚合函數返回一個單個值,該值是基于整個表中的數據計算的。聚合函數不能使用窗口,因為它們需要訪問整個表的數據才能計算結果。?
SELECT SUM(sales) FROM orders;SELECT SUM(sales) OVER (PARTITION BY product_id ORDER BY order_date);

第一個查詢使用聚合函數 SUM 計算整個表中所有訂單的總銷售額。
第二個查詢使用窗口函數 SUM 計算每個產品的總銷售額。窗口函數 SUM 使用 ORDER BY 子句對訂單按日期排序,然后計算每個產品的總銷售額。?
窗口函數和聚合函數都是在數據庫中對數據進行計算的強大工具。但是,它們之間有一些關鍵區別,因此在選擇使用哪種函數時需要考慮這些區別。

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

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

相關文章

目標檢測——R-FCN算法解讀

論文&#xff1a;R-FCN: Object Detection via Region-based Fully Convolutional Networks 作者&#xff1a;Jifeng Dai, Yi Li, Kaiming He and Jian Sun 鏈接&#xff1a;https://arxiv.org/pdf/1605.06409v2.pdf 代碼&#xff1a;https://github.com/daijifeng001/r-fcn 文…

5.鴻蒙hap可以直接點擊包安裝嗎?

5.鴻蒙hap可以直接點擊包安裝嗎&#xff1f; hap與apk不同&#xff0c;獲取的hap不能直接安裝 安裝方法1&#xff1a; DevEco studio打開項目源文件&#xff0c;打開手機USB調試&#xff0c;DevEco識別到手機后&#xff0c;點擊播放按鈕安裝到手機 https://txwtech.blog.cs…

Rust 通用代碼生成器蓮花發布紅蓮嘗鮮版十八介紹視頻,初學者指南

Rust 通用代碼生成器蓮花發布紅蓮嘗鮮版十八介紹視頻&#xff0c;初學者指南 Rust 通用代碼生成器蓮花發布深度修復版紅蓮嘗鮮版十八介紹視頻&#xff0c;初學者指南&#xff0c;詳細介紹代碼生成器環境搭建&#xff0c;編譯&#xff0c;運行和使用代碼生成物&#xff0c;歡迎…

飛天使-linux操作的一些技巧與知識點6

文章目錄 在議playbook虛擬環境中安裝ansibleplaybook 結合變量的一些演示普通的vars_files 變量&#xff0c;在同級目錄創建目錄使用host_vars 定義變量group_vars定義變量根據不同系統操作不同版本傳遞多個外置變量舉例幾個不同的示例factswhenloophandlers 與 notifytags 任…

nginx中的正則表達式及location和rewrite

目錄 常用的Nginx 正則表達式 location和rewrite的區別 location location 大致可以分為三類 location 常用的匹配規則 location 優先級 location 示例說明 location優先級的總結 rewrite rewrite的功能 rewrite實現跳轉的條件 rewrite的執行順序 rewrite的語法格式…

ARM day3

題目&#xff1a;實現3盞燈的流水 代碼&#xff1a; .text .global _start _start: 設置RCC寄存器使能 LDR R0,0X50000A28 LDR R1,[R0] ORR R1,R1,#(0X1<<4) ORR R1,R1,#(0X1<<5) STR R1,[R0]設置PE10管腳為輸出模式 LDR R0,0X50006000 LDR R1,[R0] BIC R1,R1,…

文心ERNIE Bot SDK+LangChain:基于文檔、網頁的個性化問答系統

現在各行各業紛紛選擇接入大模型&#xff0c;其中最火且可行性最高的形式無異于智能文檔問答助手&#xff0c;而LangChain是其中主流技術實現工具&#xff0c;能夠輕松讓大語言模型與外部數據相結合&#xff0c;從而構建智能問答系統。ERNIE Bot SDK已接入文心大模型4.0能力&am…

如何使用Imagewheel本地搭建一個簡單的的私人圖床公網可訪問?

文章目錄 1.前言2. Imagewheel網站搭建2.1. Imagewheel下載和安裝2.2. Imagewheel網頁測試2.3.cpolar的安裝和注冊 3.本地網頁發布3.1.Cpolar臨時數據隧道3.2.Cpolar穩定隧道&#xff08;云端設置&#xff09;3.3.Cpolar穩定隧道&#xff08;本地設置&#xff09; 4.公網訪問測…

Java:字符流 文件輸出 與 讀入 方法

Java&#xff1a;字節流 文件輸出與讀入方法 并 實現文件拷貝 文章目錄 字符流FileReaderFileWrite 字符流 字符流底層就是字節流。 字符流 字節流 字符集 特點&#xff1a; 輸入流&#xff1a;一次讀入一個字節&#xff0c;遇到中文時&#xff0c;一次讀多個字節。 輸出流…

POJ-2777 Count Color

經典區間染色板子題 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e610; struct Segment{int l,r,id; }tr[N<<2]; int n,color,m;void pushdown(int u){if(tr[u].id){tr[u<<1].id tr[u<&l…

P5707 【深基2.例12】上學遲到題解

題目 學校和 yyy 的家之間的距離為s米&#xff0c;而 yyy 以v米每分鐘的速度勻速走向學校。 在上學的路上&#xff0c;yyy 還要額外花費10分鐘的時間進行垃圾分類。 學校要求必須在上午8:00到達&#xff0c;請計算在不遲到的前提下&#xff0c;yyy 最晚能什么時候出門。 由…

python中PDF2docx運行時出現錯誤提示:pixmap must be grayscale or rgb to write as png,怎樣解決?

這是由于pixmap&#xff08;像素圖&#xff09;的顏色空間不是灰度或RGB而導致的。可能是因為PDF2docx試圖將不支持的顏色空間轉換為PNG格式造成的。 要解決此問題&#xff0c;可以嘗試以下幾個步驟&#xff1a; 1.升級pdf2docx到最新版本。有時候最新版本已經解決了這個問題…

【影像組學入門百問】1#---#3

#1-影像組學的常規步驟是怎么樣的&#xff1f; 傳統影像組學的步驟包括&#xff1a; 1、影像獲取及預處理&#xff1b; 2、感興趣區(ROI)標定&#xff1b; 3、影像組學特征提取&#xff1b; 4、特征降維&#xff1b; 5、模型建立、優化。 #2-做影像組學用的電腦硬件配置有什么…

計算機視覺之手勢、面部、姿勢捕捉以Python Mediapipe為工具

計算機視覺之手勢、面部、姿勢捕捉以 Python Mediapipe為工具 文章目錄 1.Mediapipe庫概述2.手勢捕捉(hands)3.面部捕捉(face)4.姿勢捕捉(pose) 1.Mediapipe庫概述 Mediapipe是一個開源且強大的Python庫&#xff0c;由Google開發和維護。它提供了豐富的工具和功能&#xff0c…

ExecuteScalar()方法

ExecuteScalar()方法 大家好&#xff0c;我是免費搭建查券返利機器人賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天&#xff0c;我們將深入探討數據庫編程中的一個關鍵主題——ExecuteScalar()方法&#xff…

stm32學習總結:3、Proteus8+STM32CubeMX+MDK很有搞頭

stm32學習總結&#xff1a;3、Proteus8STM32CubeMXMDK很有搞頭 文章目錄 stm32學習總結&#xff1a;3、Proteus8STM32CubeMXMDK很有搞頭一、前言二、資料收集三、實際案例-點燈1、Proteus8安裝2、Proteus創建stm32F013C6項目并添加外圍LED電路3、STM32CubeMX配置F103C6引腳生成…

12.10_黑馬數據結構與算法筆記Java

目錄 058 鏈表 e10 判環算法1 thinking&#xff1a;什么是空指針&#xff1f; 058 鏈表 e10 判環算法2 059 數組 e01 合并有序數組1 059 數組 e01 合并有序數組2 060 隊列 鏈表實現1 061 隊列 鏈表實現2 062 隊列 環形數組實現 方法1-1 063 隊列 環形數組實現 方法1-2…

帶有 RaspiCam 的 Raspberry Pi 監控和延時攝影攝像機

一、說明 一段時間以來&#xff0c;我一直想構建一個運動激活且具有延時功能的樹莓派相機&#xff0c;但從未真正找到我喜歡的案例。我在thingiverse上找到了這個適合樹莓派和相機的好案例。它是為特定的魚眼相機設計的&#xff0c;但從模型來看&#xff0c;我擁有的廉價中國魚…

【Vulnhub 靶場】【Hackable: III】【簡單 - 中等】【20210602】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/hackable-iii,720/ 靶場下載&#xff1a;https://download.vulnhub.com/hackable/hackable3.ova 靶場難度&#xff1a;簡單 - 中等 發布日期&#xff1a;2021年06月02日 文件大小&#xff1a;1.6 GB 靶場作者&…