SQL?Server中row_number函數(shù)用法入門介紹
一、SQL Server Row_number函數(shù)簡(jiǎn)介
ROW_NUMBER()是一個(gè)Window函數(shù),它為結(jié)果集的分區(qū)中的每一行分配一個(gè)連續(xù)的整數(shù)。 行號(hào)以每個(gè)分區(qū)中第一行的行號(hào)開頭。
語(yǔ)法實(shí)例:
select *,row_number() over(partition by column1 order by column2) as n from tablename
在上面語(yǔ)法中:
- PARTITION BY子句將結(jié)果集劃分為分區(qū)。 ROW_NUMBER()函數(shù)分別應(yīng)用于每個(gè)分區(qū),并重新初始化每個(gè)分區(qū)的行號(hào)。
- PARTITION BY子句是可選的。如果未指定,ROW_NUMBER()函數(shù)會(huì)將整個(gè)結(jié)果集視為單個(gè)分區(qū)。
- ORDER BY子句定義結(jié)果集的每個(gè)分區(qū)中的行的邏輯順序。 ORDER BY子句是必需的,因?yàn)镽OW_NUMBER()函數(shù)對(duì)順序敏感
二、Row_number函數(shù)的具體用法
1.使用row_number()函數(shù)對(duì)結(jié)果集進(jìn)行編號(hào)
示例:
對(duì)test_user表的查詢結(jié)果標(biāo)記行號(hào),并新增 “編號(hào)”列返回
-- 使用 ROW_NUMBER()函數(shù)對(duì)結(jié)果進(jìn)行編號(hào) select ROW_NUMBER() over(order by id) as 編號(hào),* from test_user;
運(yùn)行結(jié)果:
可以看到,查詢結(jié)果新增了一列,專門用來(lái)標(biāo)記行號(hào)。
有了編號(hào),我們就可以方便地進(jìn)行分頁(yè)查詢了,如何操作,可參考另外篇文章:sqlServer如何實(shí)現(xiàn)分頁(yè)查詢
2.對(duì)結(jié)果集按照指定列進(jìn)行分組,并在組內(nèi)按照指定列排序
示例:
把test_user表的name按照小組進(jìn)行分組顯示,分組后在組內(nèi)進(jìn)行從低到高id排序
-- 使用partition by對(duì)結(jié)果集進(jìn)行分組 select *,row_number() over(partition by name order by id) as n from test_user;
運(yùn)行結(jié)果:
3.對(duì)結(jié)果集按照指定列去重
示例:
對(duì) test_user表按name進(jìn)行分組顯示,結(jié)果集中只顯示每組中一條 id最小的數(shù)據(jù)
select a.* from ( select *,row_number() over(partition by name order by id) as row_id from test_user ) as a -- 只查詢組內(nèi)編號(hào)為1的數(shù)據(jù) where a.row_id<2;
運(yùn)行結(jié)果:
查詢結(jié)果先是經(jīng)過(guò)name分組,然后組內(nèi)進(jìn)行id升序排序,組內(nèi)編號(hào)為1的第1條數(shù)據(jù),自然就是id最小的數(shù)據(jù)。
注意:
當(dāng)我們按成績(jī)分?jǐn)?shù)查詢名次等需求時(shí),不能用row_number(),因?yàn)槿绻嘤袃蓚€(gè)并列第一,row_number()只返回一個(gè)結(jié)果。這個(gè)時(shí)候就要用到另外一個(gè)函數(shù),rank()和dense_rank()。
rank()和dense_rank()區(qū)別:
1、RANK()
在計(jì)算排序時(shí),若存在相同位次,會(huì)跳過(guò)之后的位次。
例如,有3條排在第1位時(shí),排序?yàn)椋?,1,1,4······
2、DENSE_RANK()
這就是題目中所用到的函數(shù),在計(jì)算排序時(shí),若存在相同位次,不會(huì)跳過(guò)之后的位次。
例如,有3條排在第1位時(shí),排序?yàn)椋?,1,1,2······
總結(jié)
到此這篇關(guān)于SQL Server中row_number函數(shù)用法入門介紹的文章就介紹到這了,更多相關(guān)SQLServer row_number函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql server刪除前1000行數(shù)據(jù)的方法實(shí)例
最近處理數(shù)據(jù)的時(shí)候遇到了個(gè)問(wèn)題,需要利用sql刪除表格的前1000行數(shù)據(jù),嘗試過(guò)后這里給大家分享下過(guò)程,所以下面這篇文章主要給大家介紹了關(guān)于sql server刪除前1000行數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-08-08揭秘SQL Server 2014有哪些新特性(3)-可更新列存儲(chǔ)聚集索引
可更新的列存儲(chǔ)索引作為SQL Server 2014的一個(gè)關(guān)鍵功能之一,在提升數(shù)據(jù)庫(kù)的查詢性能方面貢獻(xiàn)非常突出。據(jù)微軟統(tǒng)計(jì),在面向OLAP查詢統(tǒng)計(jì)類系統(tǒng)中,相比其他SQL傳統(tǒng)版本的數(shù)據(jù)庫(kù),報(bào)表查詢的性能最大可提升上十倍。2014-08-08sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語(yǔ)句分享
開發(fā)業(yè)務(wù)需求,需要對(duì)一個(gè)表作數(shù)據(jù)分析,由于數(shù)據(jù)量較大,而且分析時(shí)字段會(huì)隨條件相應(yīng)變化而變化2012-01-01SQL Server使用腳本實(shí)現(xiàn)自動(dòng)備份的思路詳解
這篇文章主要介紹了SQL Server使用腳本實(shí)現(xiàn)自動(dòng)備份的思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法
MySQL提供了IF、IFNULL、CASE等條件判斷函數(shù),本文就來(lái)介紹一下SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法,感興趣的可以了解一下2023-10-10sqlserver 2000數(shù)據(jù)庫(kù)同步 同步兩個(gè)SQLServer數(shù)據(jù)庫(kù)的內(nèi)容
程序代碼可以有版本管理CVS進(jìn)行同步管理,可是數(shù)據(jù)庫(kù)同步就非常麻煩,只能自己改了一個(gè)后再去改另一個(gè),如果忘記了更改另一個(gè)經(jīng)常造成兩個(gè)數(shù)據(jù)庫(kù)的結(jié)構(gòu)或內(nèi)容上不一致.2010-05-05