亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

一、函數(shù)定義

1.1、ROW_NUMBER()

ROW_NUMBER() 函數(shù)用于為結(jié)果集中的每一行分配一個唯一的序號。無論是否存在重復(fù)值,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é)果集中的行進(jìn)行排名,但在處理重復(fù)值時表現(xiàn)不同。RANK() 會為相同的值分配相同的排名,并在隨后排名中跳過相應(yīng)的名次

基本語法:

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

1.3、DENSE_RANK()

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

基本語法:

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

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

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

二、使用示例

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

建表語句:

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進(jìn)行排序,并沒有使用partition by進(jìn)行分組,所以默認(rèn)是同一組,然后組內(nèi)進(jìn)行排名。

從上表可以看出:

  • ROW_NUMBER(): 會為每一行數(shù)據(jù)分配唯一連續(xù)的編號,不會因?yàn)榕琶嗤峙湎嗤木幪枴?/li>
  • RANK(): 若排名相同則分配相同的編號,并在隨后排名中跳過相應(yīng)的名次。
  • DENSE_RANK(): 若排名相同則分配相同的編號,并在隨后排名中不跳過相應(yīng)的名次。

三、總結(jié)

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

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

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

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

函數(shù)特點(diǎn)排名示例
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)文章

  • 讀取mysql一個庫下面的所有的表table

    讀取mysql一個庫下面的所有的表table

    本文給大家分享的是如何使用php實(shí)現(xiàn)讀取mysql一個庫下面的所有的表table的代碼,有需要的小伙伴可以參考下
    2016-12-12
  • Mysql 5.7.19 免安裝版遇到的坑(收藏)

    Mysql 5.7.19 免安裝版遇到的坑(收藏)

    這篇文章給大家分享了mysql 5.7.19免安裝版在安裝過程中遇到的一些問題,以前有mysql服務(wù)的話 需要去停掉mysql服務(wù)。具體內(nèi)容介紹大家參考下本文
    2017-08-08
  • MySQL中報錯:Can’t find file: ‘./mysql/plugin.frm’的解決方法

    MySQL中報錯:Can’t find file: ‘./mysql/plugin.frm’的解決方法

    這篇文章主要給大家介紹了關(guān)于在MySQL中報錯:Can't find file: './mysql/plugin.frm'的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • MySQL高效可靠處理持久化數(shù)據(jù)的教程指南

    MySQL高效可靠處理持久化數(shù)據(jù)的教程指南

    這篇文章主要給大家詳細(xì)介紹了 MySQL 如何高效可靠處理持久化數(shù)據(jù),文中有詳細(xì)的流程步驟和代碼示例,對我們的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • mysql中的limit和offset用法詳解

    mysql中的limit和offset用法詳解

    這篇文章主要介紹了mysql中的limit和offset用法詳解,limit一般被用來排序,offset一般和limit組合使用,本文對這兩個函數(shù)進(jìn)行詳細(xì)介紹,需要的朋友可以參考下
    2023-10-10
  • CMS不要讓MySQL為你流淚

    CMS不要讓MySQL為你流淚

    MySQL是中小型網(wǎng)站普遍使用的數(shù)據(jù)庫之一,然而,很多人并不清楚MySQL到底能支持多大的數(shù)據(jù)量,再加上某些國內(nèi)CMS廠商把數(shù)據(jù)承載量的責(zé)任推給它,導(dǎo)致很多不了解MySQL的站長對它產(chǎn)生了很多誤解
    2008-12-12
  • mysql如何查詢表中的字段數(shù)量

    mysql如何查詢表中的字段數(shù)量

    這篇文章主要介紹了mysql如何查詢表中的字段數(shù)量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解MySQL 重做日志(redo log)與回滾日志(undo logo)

    詳解MySQL 重做日志(redo log)與回滾日志(undo logo)

    這篇文章主要介紹了MySQL redo與undo日志的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql缺少my.ini文件的最佳解決方法

    mysql缺少my.ini文件的最佳解決方法

    my.ini是MySQL數(shù)據(jù)庫中使用的配置文件,修改這個文件可以達(dá)到更新配置的目的,下面這篇文章主要給大家介紹了關(guān)于mysql缺少my.ini文件的最佳解決方法,需要的朋友可以參考下
    2024-01-01
  • MySQL中替代Like模糊查詢的函數(shù)方式

    MySQL中替代Like模糊查詢的函數(shù)方式

    這篇文章主要介紹了MySQL中替代Like模糊查詢的函數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論