四個排名函數(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é)果集中的任意順序進(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ù)記錄。例如,在一個表中,有重復(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ū)的行進(jìn)行排名。如果省略PARTITION BY,則所有行將合并成一個分區(qū),然后進(jìn)行排名。
排序表達(dá)式是必需的,可以指定一個或多個表達(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排名有個問題,即字段內(nèi)容相同時,會得到相同名次,并且后續(xù)會跳過幾個名次,如圖:
3. DENSE_RANK
3.1 介紹
DENSE_RANK()是SQL中的一個窗口函數(shù)(window function),用于查詢結(jié)果中的排名。與RANK()類似,不同之處在于DENSE_RANK()不會出現(xiàn)相同的排名。即使有多個值排名相同,緊隨其后的排名也會按照定義進(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ù)編號。常見的用途是將數(shù)據(jù)進(jìn)行分組或劃分。
語法:
NTILE(n) OVER (ORDER BY expr)
其中n:指定將數(shù)據(jù)分成的份數(shù)。ORDER BY expr:指定按照哪個表達(dá)式來進(jìn)行排序。
4.2 使用場景及例子
4.2.1 排名
通過order by進(jìn)行排序得到排名。文章來源:http://www.zghlxwxcb.cn/news/detail-427455.html
SELECT
id,
name,
score,
NTILE(4) OVER(
ORDER BY score DESC) AS ranks
FROM
student_info
文章來源地址http://www.zghlxwxcb.cn/news/detail-427455.html
到了這里,關(guān)于常見的四種排名函數(shù)的用法(sql)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!