摘要:在本教學中,您將學習如何使用 SQL DENSE_RANK()
函數對分割區中的資料列進行排名,且排名值之間沒有間隙。
SQL DENSE_RANK() 函數概述
DENSE_RANK()
是一個視窗函數,它會將排名分配給分割區中的資料列,且排名值之間沒有間隙。
如果每個分割區中有兩個或多個資料列具有相同的值,它們將獲得相同的排名。下一個資料列的排名會增加一。
與 RANK()
函數不同,DENSE_RANK()
函數總是產生連續的排名值。
DENSE_RANK()
函數的語法如下
DENSE_RANK() OVER (
PARTITION BY expr1[{,expr2...}]
ORDER BY expr1 [ASC|DESC], [{,expr2...}]
)
Code language: SQL (Structured Query Language) (sql)
在此語法中
- 首先,
PARTITION BY
子句將FROM
子句產生的結果集劃分為多個分割區。 - 然後,
ORDER BY
指定每個分割區中資料列的順序。 - 最後,
DENSE_RANK()
函數會應用於每個分割區中指定順序的資料列。當跨越分割區邊界時,它會重置排名。
以下陳述式建立一個名為 t
的表格,並將一些資料列插入到該表格中
CREATE TABLE t (
col CHAR
);
INSERT INTO t(col)
VALUES('A'),('B'),('B'),('C'),('D'),('D'),('E');
SELECT
*
FROM
t;
Code language: SQL (Structured Query Language) (sql)
以下陳述式同時使用 DENSE_RANK()
和 RANK()
函數,以將排名分配給結果集的每個資料列
SELECT
col,
DENSE_RANK() OVER (
ORDER BY col
) my_dense_rank,
RANK() OVER (
ORDER BY col
) my_rank
FROM
t;
Code language: SQL (Structured Query Language) (sql)
以下是輸出結果

SQL DENSE_RANK() 函數範例
我們將使用範例資料庫中的 employees
和 departments
表格進行示範。

在結果集上使用 SQL DENSE_RANK() 的範例
以下陳述式使用 DENSE_RANK()
函數依員工的薪資進行排名
SELECT
employee_id,
first_name,
last_name,
salary,
DENSE_RANK() OVER (
ORDER BY salary DESC
) salary_rank
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
在這個範例中,我們省略了 PARTITION BY
子句,因此 DENSE_RANK()
函數將整個結果集視為單一分割區。
首先,ORDER BY
子句依遞減順序對薪資進行排序。然後,DENSE_RANK()
函數根據員工的薪資金額為每位員工分配排名。
下圖顯示查詢的部分輸出

在分割區上使用 SQL DENSE_RANK() 的範例
以下陳述式根據員工的薪資,對每個部門的員工進行排名
SELECT
first_name,
last_name,
department_name,
salary,
DENSE_RANK() OVER (
PARTITION BY department_name
ORDER BY salary DESC) salary_rank
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)
在這個範例中
- 首先,
PARTITION BY
子句根據部門名稱將員工劃分為多個分割區。 - 然後,
ORDER BY
子句根據每個部門(分割區)中員工的薪資進行排序。 - 最後,
DENSE_RANK()
函數會應用於每個分割區,以根據薪資順序為資料列分配排名。
下圖顯示查詢的部分輸出

如果您只想找到部門中薪資最高的員工,您只需在 FROM
子句中使用 子查詢,如下所示
SELECT
*
FROM (
SELECT
first_name,
last_name,
department_name,
salary,
DENSE_RANK() OVER (
PARTITION BY department_name
ORDER BY salary DESC) salary_rank
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id
) t
WHERE
salary_rank = 1;
Code language: SQL (Structured Query Language) (sql)
以下輸出顯示部門中薪資最高的員工

在本教學中,您已經學習如何使用 SQL DENSE_RANK()
函數對分割區中的資料列進行排名,且排名值之間沒有間隙。
這個教學對您有幫助嗎?