最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)庫中row_number()、rank() 和 dense_rank() 的區(qū)別

 更新時間:2024年11月18日 11:33:16   作者:五月天的尾巴  
本文主要結(jié)合了SQL中的排名函數(shù)ROW_NUMBER()、RANK()和DENSE_RANK(),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在數(shù)據(jù)分析和處理的過程中,尤其是在使用 SQL 進行查詢時,排名函數(shù)(Ranking Functions)是一個非常重要的工具。Apache Hive 和其他數(shù)據(jù)庫系統(tǒng)都提供了一些排名函數(shù),常見的包括 ROW_NUMBER()、RANK() 和 DENSE_RANK()。雖然這三個函數(shù)都可以用于為結(jié)果集中的行分配一個排名,但它們的工作原理和返回結(jié)果卻各不相同。本文將深入探討這三個函數(shù)的區(qū)別、使用場景以及實例演示。

ROW_NUMBER()、RANK() 和 DENSE_RANK()是排名函數(shù),也叫分組排序函數(shù)。即可以對查詢結(jié)果集進行分組后進行排序,對結(jié)果集的每一行分配一個編號。例如:對考試成績按科目進行分組,然后按分數(shù)排序,獲取前5名。

ROW_NUMBER()、RANK() 和 DENSE_RANK()這三個函數(shù)在mysql8.0、hive、oracle都是支持的

一、函數(shù)定義

1.1、ROW_NUMBER()

ROW_NUMBER() 函數(shù)用于為結(jié)果集中的每一行分配一個唯一的序號。無論是否存在重復值,ROW_NUMBER() 返回的序號都是連續(xù)的。這個函數(shù)常用于需要唯一行號的場景。

基本語法:

ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)
  • PARTITION BY:指定如何將結(jié)果集分組。
  • ORDER BY:指定每個分組內(nèi)的排序規(guī)則。

1.2、RANK()

RANK() 函數(shù)與 ROW_NUMBER() 類似,也用于對結(jié)果集中的行進行排名,但在處理重復值時表現(xiàn)不同。RANK() 會為相同的值分配相同的排名,并在隨后排名中跳過相應的名次。

基本語法:

RANK() OVER (PARTITION BY column1 ORDER BY column2)

1.3、DENSE_RANK()

DENSE_RANK() 函數(shù)也是用于排名的,其與 RANK() 的主要區(qū)別在于處理重復值時的行為。DENSE_RANK() 為相同的值分配相同的排名,但不會跳過名次。

基本語法:

DENSE_RANK() OVER (PARTITION BY column1 ORDER BY column2)

1.4、row_number()、rank() 和 dense_rank() 的區(qū)別

  • ROW_NUMBER():為每一行分配一個唯一的行號。即使有重復值,返回的行號也是唯一且連續(xù)的。
  • RANK():為相同的值分配相同的排名,但在后續(xù)排名中會跳過相應的名次。例如,如果有兩個并列第一的記錄,則下一個記錄的排名為第三。
  • DENSE_RANK():與 RANK() 類似,給相同的值分配相同的排名,但后續(xù)排名不會跳過。相同的值后面的排名是緊接著的下一個值。

二、使用示例

結(jié)合示例來看一下三者之間的區(qū)別,以下sql基于MySql8.0進行講解。

建表語句:

create table test(
       id varchar(10) NOT NULL,
       `name` varchar(10) NULL,
       age varchar(10) NULL,
       salary int NULL
);
-- 數(shù)據(jù)是每個人不同年齡段的薪資數(shù)據(jù)
insert into test(id,`name`,age,salary) values(1,'張三',24,15000);
insert into test(id,`name`,age,salary) values(2,'李四',22,8000);
insert into test(id,`name`,age,salary) values(3,'王五',20,6500);
insert into test(id,`name`,age,salary) values(4,'趙六',23,15000);
insert into test(id,`name`,age,salary) values(5,'孫七',22,8000);
insert into test(id,`name`,age,salary) values(6,'周八',21,7500);

表數(shù)據(jù):

在這里插入圖片描述

以下是使用這三個函數(shù)的 SQL 查詢示例:

SELECT id, name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
       RANK() OVER (ORDER BY salary DESC) AS `rank`,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS `dense_rank`
FROM test;

在這里插入圖片描述

注意:以上sql只使用了order by進行排序,并沒有使用partition by進行分組,所以默認是同一組,然后組內(nèi)進行排名。

從上表可以看出:

  • ROW_NUMBER(): 會為每一行數(shù)據(jù)分配唯一連續(xù)的編號,不會因為排名相同而分配相同的編號。
  • RANK(): 若排名相同則分配相同的編號,并在隨后排名中跳過相應的名次。
  • DENSE_RANK(): 若排名相同則分配相同的編號,并在隨后排名中不跳過相應的名次。

三、總結(jié)

在數(shù)據(jù)分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具。它們可以幫助用戶快速對數(shù)據(jù)進行排名和分類分析。雖然這三種函數(shù)的作用相似,但因其在處理重復值時的行為不同,所以在使用時需要根據(jù)具體需求進行選擇。

3.1、row_number()、rank() 和 dense_rank() 的區(qū)別

  • ROW_NUMBER():為每一行分配唯一的行號,適合唯一標識需求。
  • RANK():為重復值分配相同的排名,并在后續(xù)排名中跳過名次,適合需要處理排名的場景。
  • DENSE_RANK():為重復值分配相同的排名,但不跳過名次,適合希望連續(xù)排名的場景。

下面表格總結(jié)了這三個函數(shù)的主要區(qū)別:

函數(shù)特點排名示例
ROW_NUMBER為每行分配唯一的數(shù)字1, 2, 3, 4, …
RANK相同的值共享相同的排名,排名會跳過數(shù)字1, 1, 3, 4, …
DENSE_RANK相同的值共享相同的排名,不跳過數(shù)字1, 1, 2, 3, …

具體請參考《row_number() over (partition by 分組列 order by 排序列 desc)、row_number() 函數(shù)、分組排序函數(shù)》、《數(shù)據(jù)庫rank()分組排序函數(shù)詳解》、《數(shù)據(jù)庫dense_rank() 函數(shù)的使用、MySQL之dense_rank()、Hive之dense_rank()函數(shù)

到此這篇關(guān)于數(shù)據(jù)庫中row_number()、rank() 和 dense_rank() 的區(qū)別的文章就介紹到這了,更多相關(guān)row_number() rank()  dense_rank()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 10個mysql中select語句的簡單用法

    10個mysql中select語句的簡單用法

    本篇文章主要講述的是MySQL SELECT句法的簡單分析,我們大家都知道MySQL數(shù)據(jù)庫是我們大家經(jīng)常使用的數(shù)據(jù)庫,其相關(guān)的應用也是備受關(guān)注的,那么以下的文章主要是對MySQL SELECT句法的簡單分析。
    2014-08-08
  • Mariadb數(shù)據(jù)庫的備份與恢復過程詳細介紹

    Mariadb數(shù)據(jù)庫的備份與恢復過程詳細介紹

    MariaDB是一個流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),備份與恢復數(shù)據(jù)是數(shù)據(jù)庫管理中非常重要的一個環(huán)節(jié),能夠保證數(shù)據(jù)的安全性和可靠性,這篇文章主要介紹了Mariadb數(shù)據(jù)庫的備份與恢復過程的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • mysql中IFNULL,IF,CASE的區(qū)別介紹

    mysql中IFNULL,IF,CASE的區(qū)別介紹

    本文將詳細介紹mysql中IFNULL,IF,CASE的區(qū)別,需要了解的朋友可以參考下
    2012-11-11
  • Mysql LONGBLOB 類型存儲二進制數(shù)據(jù) (修改+調(diào)試+整理)

    Mysql LONGBLOB 類型存儲二進制數(shù)據(jù) (修改+調(diào)試+整理)

    代碼來自網(wǎng)絡,我學習整理了一下,測試通過,下面的參數(shù)需要設置為你自己的
    2009-07-07
  • Mysql中STR_TO_DATE函數(shù)使用(字符串轉(zhuǎn)為日期/時間值)

    Mysql中STR_TO_DATE函數(shù)使用(字符串轉(zhuǎn)為日期/時間值)

    這篇文章主要給大家介紹了關(guān)于Mysql中STR_TO_DATE函數(shù)使用的相關(guān)資料,STR_TO_DATE函數(shù)的主要功能是字符串轉(zhuǎn)為日期/時間值,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • MySQL插入emoji表情失敗問題的解決方法

    MySQL插入emoji表情失敗問題的解決方法

    emoji表情在我們?nèi)粘i_發(fā)中經(jīng)常會遇到,但是最近在mysql中插入emoji表情遇到了問題,通過查找相關(guān)的資料終于解決了,所以將這次解決的過程分享出來,這篇文章主要就給大家介紹了MySQL插入emoji表情失敗問題的解決方法,需要的朋友可以參考。
    2017-05-05
  • MySQL邏輯備份into?outfile

    MySQL邏輯備份into?outfile

    這篇文章主要介紹了MySQL?備份之?into?outfile,文章圍繞主題展開詳細內(nèi)容介紹,具有一定的參考價值需要的小伙伴可以參考一下
    2022-05-05
  • 詳解MySQL alter ignore 語法

    詳解MySQL alter ignore 語法

    這篇文章主要介紹了MySQL alter ignore 語法的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • MAC系統(tǒng)中添加MYSQL開機啟動的方法

    MAC系統(tǒng)中添加MYSQL開機啟動的方法

    這篇文章主要介紹了MAC系統(tǒng)中添加MYSQL開機啟動的方法,本文簡潔易懂,步驟清晰,需要的朋友可以參考下
    2014-11-11
  • MYSQL慢查詢和日志實例講解

    MYSQL慢查詢和日志實例講解

    這篇文章主要介紹了MYSQL慢查詢和日志實例講解,有對這方面感興趣的同學可以研究學習下
    2021-02-02

最新評論

湘乡市| 汝州市| 襄城县| 云阳县| 沽源县| 金山区| 伊金霍洛旗| 莱州市| 广东省| 枞阳县| 邓州市| 北海市| 于田县| 开阳县| 新沂市| 惠水县| 三门县| 安丘市| 沾益县| 马关县| 合山市| 璧山县| 将乐县| 临泉县| 沿河| 芜湖县| 武安市| 青州市| 江孜县| 神池县| 肥乡县| 理塘县| 布尔津县| 津南区| 都匀市| 镇原县| 宁安市| 温泉县| 元阳县| 霞浦县| 宾川县|