中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-12 09:31:00 來源:億速云 閱讀:303 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關SQL 中的distinct和row_number() over() 有什么區別,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在 SQL 中,關鍵字 distinct 用于返回唯一不同的值。其語法格式為:

SELECT DISTINCT 列名稱 FROM 表名稱

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

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

觀察以上的表,咱們會發現:擁有相同 NAME 的記錄有兩條,擁有相同 AGE 的記錄有三條。如果咱們運行下面這條 SQL 語句,

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

select name from PPPRDER.CESHIDEMO

將會得到如下結果:

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

觀察該結果,咱們會發現在以上的四條記錄中,包含兩條 NAME 值相同的記錄,即第 2 條記錄和第 3 條記錄的值都為“gavin”。那么,如果咱們想讓擁有相同 NAME 的記錄只顯示一條該如何實現呢?這時,就需要用到 distinct 關鍵字啦!接下來,運行如下 SQL 語句,

select distinct name from PPPRDER.CESHIDEMO

將會得到如下結果:

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

觀察該結果,顯然咱們的要求得到實現啦!但是,咱們不禁會想到,如果將 distinct 關鍵字同時作用在兩個字段上將會產生什么效果呢?既然想到了,咱們就試試唄,運行如下 SQL 語句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結果如下所示:

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

觀察該結果,哎呀,貌似沒有作用啊?她將全部的記錄都顯示出來了啊!其中 NAME 值相同的記錄有兩條,AGE 值相同的記錄有三條,完全沒有變化啊!但事實上,結果就應該是這樣的。因為當 distinct 作用在多個字段的時候,她只會將所有字段值都相同的記錄“去重”掉,顯然咱們“可憐”的四條記錄并不滿足該條件,因此 distinct 會認為上面四條記錄并不相同。空口無憑,接下來,咱們再向表“CESHIDEMO”中添加一條完全相同的記錄,驗證一下即可。添加一條記錄后的表如下所示:

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

再運行如下的 SQL 語句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結果如下所示:

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

觀察該結果,完美的驗證了咱們上面的結論。

此外,有一點需要大家特別注意,即:關鍵字 distinct 只能放在 SQL 語句中所有字段的最前面才能起作用,如果放錯位置,SQL 不會報錯,但也不會起到任何效果。

3 row_number() over()

在 SQL Server 數據庫中,為咱們提供了一個函數 row_number() 用于給數據庫表中的記錄進行標號,在使用的時候,其后還跟著一個函數 over(),而函數 over() 的作用是將表中的記錄進行分組和排序。兩者使用的語法為:

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

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

  • PARTITION BY:表示分組

  • ORDER BY:表示排序

接下來,咱們還用表“CESHIDEMO”中的數據進行測試。首先,給出沒有使用 row_number() over() 函數時查詢的結果,如下所示:

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

然后,運行如下 SQL 語句,

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

得到的結果如下所示:

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

從上面的結果可以看出,其在原表的基礎上,多了一列標有數字排序的列。那么反過來分析咱們運行的 SQL 語句,發現其確實按字段 AGE 的值進行分組了,也按字段 NAME 的值進行排序啦!因此,函數的功能得到了驗證。

接下來,咱們就研究如何用 row_number() over() 函數實現“去重”的功能。通過觀察上面的結果,咱們可以發現,如果以 NAME 分組,以 AGE 排序,然后再取每組的第一個記錄或許就可以實現“去重”的功能啊!那么試試看,運行如下 SQL 語句,

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

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

運行后,得到的結果如下所示:

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

觀察以上的結果,我們發現,哎呀,數據“去重”的功能一不小心就被咱們實現了啊!不過很遺憾,如果咱們細心的話,會發現一個很不爽的事情,那就是在執行以上 SQL 語句進行“去重”的時候,有一條 NAME 值為“gavin”、AGE 值為“18”的記錄被過濾掉了,但是在現實生活會中,同名不同年齡的事情太正常了。

以上就是SQL 中的distinct和row_number() over() 有什么區別,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

修文县| 北流市| 平利县| 广丰县| 安化县| 南靖县| 青龙| 潢川县| 祁连县| 谷城县| 时尚| 尼玛县| 承德市| 扬州市| 九龙城区| 永嘉县| 大邑县| 新竹市| 甘肃省| 新干县| 蒙城县| 奉新县| 霍林郭勒市| 交城县| 睢宁县| 灵武市| 谢通门县| 略阳县| 德安县| 霍州市| 兴义市| 新龙县| 金乡县| 五寨县| 耿马| 赤峰市| 绥中县| 无为县| 武乡县| 镇江市| 萨嘎县|