sql中常見的四種排名函數(shù)的用法
四個排名函數(shù):
1.row_number
2.rank
3.dense_rank
4.ntile
1. ROW_NUMBER(排名場景推薦)
1.1 介紹
在 SQL 中,ROW_NUMBER() 是一個窗口函數(shù),它為結(jié)果集中的每一行分配一個唯一的序號。該函數(shù)的語法如下:
ROW_NUMBER() OVER (ORDER BY column1 [, column2, ...])
其中,ORDER BY 子句指定了 ROW_NUMBER() 函數(shù)排列行的順序。如果省略 ORDER BY,則序號將按照結(jié)果集中的任意順序進行分配。
1.2 使用場景及例子
1.2.1 排名
通過order by進行排序得到排名。
SELECT id, name, score, row_number() OVER( ORDER BY score DESC) AS ranks FROM student_info
1.2.2 去重
可以使用 ROW_NUMBER() 函數(shù)去除重復(fù)記錄。例如,在一個表中,有重復(fù)記錄,想要保留每個記錄的唯一編號。
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()是一個窗口函數(shù),用于根據(jù)指定的ORDER BY子句給結(jié)果集中的每一行分配排名值。在排序過程中,如果有多個行具有相同的排序值,則它們將被分配相同的排名值。RANK()可以在SELECT語句的SELECT子句、ORDER BY子句或OVER()子句中使用。
以下是RANK()的語法:
RANK() OVER ( [PARTITION BY partition_expression, ... [n]] ORDER BY sort_expression [ASC|DESC], ... [n] )
在這個語法中,PARTITION BY子句可選,它用于將結(jié)果集分割成不同的分區(qū),然后對每個分區(qū)的行進行排名。如果省略PARTITION BY,則所有行將合并成一個分區(qū),然后進行排名。
排序表達式是必需的,可以指定一個或多個表達式以排序行。SORT_EXPRESSION可以是列名稱、函數(shù)、常量或表達式。
2.2 使用場景及例子
2.2.1 排名
通過order by進行排序得到排名。
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ū)表達式,ORDER BY子句按score列降序排序。
但使用RANK排名有個問題,即字段內(nèi)容相同時,會得到相同名次,并且后續(xù)會跳過幾個名次,如圖:
3. DENSE_RANK
3.1 介紹
DENSE_RANK()是SQL中的一個窗口函數(shù)(window function),用于查詢結(jié)果中的排名。與RANK()類似,不同之處在于DENSE_RANK()不會出現(xiàn)相同的排名。即使有多個值排名相同,緊隨其后的排名也會按照定義進行遞增。解決RANK的問題。
3.2 使用場景及例子
3.2.1 排名
通過order by進行排序得到排名。
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ù)編號。常見的用途是將數(shù)據(jù)進行分組或劃分。
語法:
NTILE(n) OVER (ORDER BY expr)
其中n:指定將數(shù)據(jù)分成的份數(shù)。ORDER BY expr:指定按照哪個表達式來進行排序。
4.2 使用場景及例子
4.2.1 排名
通過order by進行排序得到排名。
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
數(shù)據(jù)庫的使用過程中由于程序方面的問題有時候會碰到重復(fù)數(shù)據(jù),重復(fù)數(shù)據(jù)導(dǎo)致了數(shù)據(jù)庫部分設(shè)置不能正確設(shè)置2013-05-05sql server中的decimal或者numeric的精度問題
在sql server中定義列的數(shù)據(jù)類型decimal時需要制定其精度和小數(shù)位數(shù)。2009-05-05sqlserver中關(guān)于WINDOWS性能計數(shù)器的介紹
sqlserver中關(guān)于WINDOWS 性能計數(shù)器的介紹,需要的朋友可以看下2013-01-01SQL Server中Check約束的學(xué)習(xí)教程
這篇文章主要介紹了SQL Server中Check約束的學(xué)習(xí)教程,包括對啟用Check約束來提升性能的介紹,需要的朋友可以參考下2015-12-12Sqlserver 存儲過程中結(jié)合事務(wù)的代碼
Sqlserver 存儲過程中使用事務(wù)2010-06-06用SQL語句查詢數(shù)據(jù)庫中某一字段下相同值的記錄方法
本文要處理的事情實際上就是查詢數(shù)據(jù)庫表中某一字段值重復(fù)的記錄的方法2014-05-05