溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL 中的distinct和row_number() over() 有什么區(qū)別

發(fā)布時(shí)間:2021-07-12 09:31:00 來(lái)源:億速云 閱讀:296 作者:Leah 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)SQL 中的distinct和row_number() over() 有什么區(qū)別,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

在 SQL 中,關(guān)鍵字 distinct 用于返回唯一不同的值。其語(yǔ)法格式為:

SELECT DISTINCT 列名稱(chēng) FROM 表名稱(chēng)

假設(shè)有一個(gè)表“CESHIDEMO”,包含兩個(gè)字段,分別 NAME 和 AGE,具體格式如下:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察以上的表,咱們會(huì)發(fā)現(xiàn):擁有相同 NAME 的記錄有兩條,擁有相同 AGE 的記錄有三條。如果咱們運(yùn)行下面這條 SQL 語(yǔ)句,

/** * 其中 PPPRDER 為 Schema 的名字,即表 CESHIDEMO 在 PPPRDER 中 */

select name from PPPRDER.CESHIDEMO

將會(huì)得到如下結(jié)果:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察該結(jié)果,咱們會(huì)發(fā)現(xiàn)在以上的四條記錄中,包含兩條 NAME 值相同的記錄,即第 2 條記錄和第 3 條記錄的值都為“gavin”。那么,如果咱們想讓擁有相同 NAME 的記錄只顯示一條該如何實(shí)現(xiàn)呢?這時(shí),就需要用到 distinct 關(guān)鍵字啦!接下來(lái),運(yùn)行如下 SQL 語(yǔ)句,

select distinct name from PPPRDER.CESHIDEMO

將會(huì)得到如下結(jié)果:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察該結(jié)果,顯然咱們的要求得到實(shí)現(xiàn)啦!但是,咱們不禁會(huì)想到,如果將 distinct 關(guān)鍵字同時(shí)作用在兩個(gè)字段上將會(huì)產(chǎn)生什么效果呢?既然想到了,咱們就試試唄,運(yùn)行如下 SQL 語(yǔ)句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結(jié)果如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察該結(jié)果,哎呀,貌似沒(méi)有作用啊?她將全部的記錄都顯示出來(lái)了?。∑渲?NAME 值相同的記錄有兩條,AGE 值相同的記錄有三條,完全沒(méi)有變化??!但事實(shí)上,結(jié)果就應(yīng)該是這樣的。因?yàn)?strong>當(dāng) distinct 作用在多個(gè)字段的時(shí)候,她只會(huì)將所有字段值都相同的記錄“去重”掉,顯然咱們“可憐”的四條記錄并不滿足該條件,因此 distinct 會(huì)認(rèn)為上面四條記錄并不相同。空口無(wú)憑,接下來(lái),咱們?cè)傧虮怼癈ESHIDEMO”中添加一條完全相同的記錄,驗(yàn)證一下即可。添加一條記錄后的表如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

再運(yùn)行如下的 SQL 語(yǔ)句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結(jié)果如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察該結(jié)果,完美的驗(yàn)證了咱們上面的結(jié)論。

此外,有一點(diǎn)需要大家特別注意,即:關(guān)鍵字 distinct 只能放在 SQL 語(yǔ)句中所有字段的最前面才能起作用,如果放錯(cuò)位置,SQL 不會(huì)報(bào)錯(cuò),但也不會(huì)起到任何效果。

3 row_number() over()

在 SQL Server 數(shù)據(jù)庫(kù)中,為咱們提供了一個(gè)函數(shù) row_number() 用于給數(shù)據(jù)庫(kù)表中的記錄進(jìn)行標(biāo)號(hào),在使用的時(shí)候,其后還跟著一個(gè)函數(shù) over(),而函數(shù) over() 的作用是將表中的記錄進(jìn)行分組和排序。兩者使用的語(yǔ)法為:

ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

意為:將表中的記錄按字段 COLUMN1進(jìn)行分組,按字段 COLUMN2 進(jìn)行排序,其中

  • PARTITION BY:表示分組

  • ORDER BY:表示排序

接下來(lái),咱們還用表“CESHIDEMO”中的數(shù)據(jù)進(jìn)行測(cè)試。首先,給出沒(méi)有使用 row_number() over() 函數(shù)時(shí)查詢(xún)的結(jié)果,如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

然后,運(yùn)行如下 SQL 語(yǔ)句,

select  PPPRDER.CESHIDEMO.*, row_number() over(partition by age order by name desc) from PPPRDER.CESHIDEMO

得到的結(jié)果如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

從上面的結(jié)果可以看出,其在原表的基礎(chǔ)上,多了一列標(biāo)有數(shù)字排序的列。那么反過(guò)來(lái)分析咱們運(yùn)行的 SQL 語(yǔ)句,發(fā)現(xiàn)其確實(shí)按字段 AGE 的值進(jìn)行分組了,也按字段 NAME 的值進(jìn)行排序啦!因此,函數(shù)的功能得到了驗(yàn)證。

接下來(lái),咱們就研究如何用 row_number() over() 函數(shù)實(shí)現(xiàn)“去重”的功能。通過(guò)觀察上面的結(jié)果,咱們可以發(fā)現(xiàn),如果以 NAME 分組,以 AGE 排序,然后再取每組的第一個(gè)記錄或許就可以實(shí)現(xiàn)“去重”的功能?。∧敲丛囋嚳?,運(yùn)行如下 SQL 語(yǔ)句,

/* * 其中 rn 表示最后添加的那一列 */

select * from (select  PPPRDER.CESHIDEMO.*, row_number() over(partition by name order by age desc) rn from PPPRDER.CESHIDEMO)where rn = 1

運(yùn)行后,得到的結(jié)果如下所示:

SQL 中的distinct和row_number() over() 有什么區(qū)別

觀察以上的結(jié)果,我們發(fā)現(xiàn),哎呀,數(shù)據(jù)“去重”的功能一不小心就被咱們實(shí)現(xiàn)了??!不過(guò)很遺憾,如果咱們細(xì)心的話,會(huì)發(fā)現(xiàn)一個(gè)很不爽的事情,那就是在執(zhí)行以上 SQL 語(yǔ)句進(jìn)行“去重”的時(shí)候,有一條 NAME 值為“gavin”、AGE 值為“18”的記錄被過(guò)濾掉了,但是在現(xiàn)實(shí)生活會(huì)中,同名不同年齡的事情太正常了。

以上就是SQL 中的distinct和row_number() over() 有什么區(qū)別,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI