sql中常見的四種排名函數(shù)的用法
四個(gè)排名函數(shù):
1.row_number
2.rank
3.dense_rank
4.ntile
1. ROW_NUMBER(排名場景推薦)
1.1 介紹
在 SQL 中,ROW_NUMBER() 是一個(gè)窗口函數(shù),它為結(jié)果集中的每一行分配一個(gè)唯一的序號(hào)。該函數(shù)的語法如下:
ROW_NUMBER() OVER (ORDER BY column1 [, column2, ...])
其中,ORDER BY 子句指定了 ROW_NUMBER() 函數(shù)排列行的順序。如果省略 ORDER BY,則序號(hào)將按照結(jié)果集中的任意順序進(jìn)行分配。
1.2 使用場景及例子
1.2.1 排名
通過order by進(jìn)行排序得到排名。
SELECT id, name, score, row_number() OVER( ORDER BY score DESC) AS ranks FROM student_info

1.2.2 去重
可以使用 ROW_NUMBER() 函數(shù)去除重復(fù)記錄。例如,在一個(gè)表中,有重復(fù)記錄,想要保留每個(gè)記錄的唯一編號(hào)。
SELECT id, column1, column2, ...
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY id) AS row_num
FROM table_name
) subquery
WHERE row_num = 1;
1.2.3 分頁查詢
大可不必,不建議使用。
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY id) AS row_num
FROM table_name
) subquery
WHERE row_num BETWEEN 11 AND 20;
2. RANK
2.1 介紹
在SQL中,RANK()是一個(gè)窗口函數(shù),用于根據(jù)指定的ORDER BY子句給結(jié)果集中的每一行分配排名值。在排序過程中,如果有多個(gè)行具有相同的排序值,則它們將被分配相同的排名值。RANK()可以在SELECT語句的SELECT子句、ORDER BY子句或OVER()子句中使用。
以下是RANK()的語法:
RANK() OVER ( [PARTITION BY partition_expression, ... [n]] ORDER BY sort_expression [ASC|DESC], ... [n] )
在這個(gè)語法中,PARTITION BY子句可選,它用于將結(jié)果集分割成不同的分區(qū),然后對(duì)每個(gè)分區(qū)的行進(jìn)行排名。如果省略PARTITION BY,則所有行將合并成一個(gè)分區(qū),然后進(jìn)行排名。
排序表達(dá)式是必需的,可以指定一個(gè)或多個(gè)表達(dá)式以排序行。SORT_EXPRESSION可以是列名稱、函數(shù)、常量或表達(dá)式。
2.2 使用場景及例子
2.2.1 排名
通過order by進(jìn)行排序得到排名。
SELECT id, name, score, RANK() OVER( ORDER BY score DESC) AS ranks FROM student_info

2.2.2 分組排名
SELECT id, name, score, RANK() OVER(PARTITION BY name ORDER BY score DESC) AS ranks FROM student_info

PARTITION BY子句指定了name列作為分區(qū)表達(dá)式,ORDER BY子句按score列降序排序。
但使用RANK排名有個(gè)問題,即字段內(nèi)容相同時(shí),會(huì)得到相同名次,并且后續(xù)會(huì)跳過幾個(gè)名次,如圖:

3. DENSE_RANK
3.1 介紹
DENSE_RANK()是SQL中的一個(gè)窗口函數(shù)(window function),用于查詢結(jié)果中的排名。與RANK()類似,不同之處在于DENSE_RANK()不會(huì)出現(xiàn)相同的排名。即使有多個(gè)值排名相同,緊隨其后的排名也會(huì)按照定義進(jìn)行遞增。解決RANK的問題。
3.2 使用場景及例子
3.2.1 排名
通過order by進(jìn)行排序得到排名。
SELECT id, name, score, DENSE_RANK() OVER( ORDER BY score DESC) AS ranks FROM student_info

4. NTILE
4.1 介紹
NTILE函數(shù)用于將一組數(shù)據(jù)按照數(shù)量均勻地分成若干份,并給每份數(shù)據(jù)編號(hào)。常見的用途是將數(shù)據(jù)進(jìn)行分組或劃分。
語法:
NTILE(n) OVER (ORDER BY expr)
其中n:指定將數(shù)據(jù)分成的份數(shù)。ORDER BY expr:指定按照哪個(gè)表達(dá)式來進(jìn)行排序。
4.2 使用場景及例子
4.2.1 排名
通過order by進(jìn)行排序得到排名。
SELECT id, name, score, NTILE(4) OVER( ORDER BY score DESC) AS ranks FROM student_info

到此這篇關(guān)于sql中常見的四種排名函數(shù)的用法的文章就介紹到這了,更多相關(guān)sql 排名函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
數(shù)據(jù)庫的使用過程中由于程序方面的問題有時(shí)候會(huì)碰到重復(fù)數(shù)據(jù),重復(fù)數(shù)據(jù)導(dǎo)致了數(shù)據(jù)庫部分設(shè)置不能正確設(shè)置2013-05-05
SQL實(shí)現(xiàn)模糊查詢的四種方法小結(jié)
在SQL中,模糊查詢是一種通過匹配字符串中的一部分或關(guān)鍵字來查詢數(shù)據(jù)的方法,本文主要介紹了SQL實(shí)現(xiàn)模糊查詢的四種方法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
sql server中的decimal或者numeric的精度問題
在sql server中定義列的數(shù)據(jù)類型decimal時(shí)需要制定其精度和小數(shù)位數(shù)。2009-05-05
sqlserver中關(guān)于WINDOWS性能計(jì)數(shù)器的介紹
sqlserver中關(guān)于WINDOWS 性能計(jì)數(shù)器的介紹,需要的朋友可以看下2013-01-01
SQL Server中Check約束的學(xué)習(xí)教程
這篇文章主要介紹了SQL Server中Check約束的學(xué)習(xí)教程,包括對(duì)啟用Check約束來提升性能的介紹,需要的朋友可以參考下2015-12-12
Sqlserver 存儲(chǔ)過程中結(jié)合事務(wù)的代碼
Sqlserver 存儲(chǔ)過程中使用事務(wù)2010-06-06
用SQL語句查詢數(shù)據(jù)庫中某一字段下相同值的記錄方法
本文要處理的事情實(shí)際上就是查詢數(shù)據(jù)庫表中某一字段值重復(fù)的記錄的方法2014-05-05
sql?server自動(dòng)生成拼音首字母的函數(shù)
建立一個(gè)查詢,執(zhí)行語句生成函數(shù)fn_GetPy,下面是具體的實(shí)現(xiàn),需要的朋友可以參考下2014-01-01

