row_number()
是一個(gè)常見的窗口函數(shù),它在 SQL 查詢中為結(jié)果集中的每一行分配一個(gè)唯一的連續(xù)整數(shù)。這個(gè)整數(shù)通?;谀硞€(gè)排序順序,可以是升序或降序。通過使用 row_number()
,你可以為數(shù)據(jù)集添加一個(gè)額外的列,該列表示其在排序后的位置。
以下是如何使用 row_number()
的基本語(yǔ)法:
SELECT
column1,
column2,
...,
row_number() OVER (ORDER BY column1, column2, ...) AS row_num
FROM
your_table;
在這個(gè)例子中,your_table
是你要查詢的表名,column1, column2, ...
是你想要根據(jù)其進(jìn)行排序的列名。AS row_num
是可選的,用于給生成的列指定一個(gè)別名。
舉個(gè)例子,假設(shè)你有一個(gè)名為 employees
的表,其中包含以下列:id
, department_id
, salary
, name
。你想要查詢每個(gè)部門的員工數(shù)量,并按照部門ID和工資進(jìn)行排序。你可以這樣寫:
SELECT
department_id,
COUNT(*) AS num_employees,
row_number() OVER (PARTITION BY department_id ORDER BY salary) AS emp_num
FROM
employees
GROUP BY
department_id,
salary;
在這個(gè)查詢中,PARTITION BY department_id
表示 row_number()
函數(shù)將為每個(gè)部門分別生成行號(hào)。ORDER BY salary
表示在每個(gè)部門內(nèi)部,行號(hào)將根據(jù)工資進(jìn)行排序。注意,雖然這里沒有明確使用 GROUP BY
子句,但由于我們使用了聚合函數(shù) COUNT(*)
,所以實(shí)際上還是在按部門進(jìn)行分組。
如果你想要在整個(gè)結(jié)果集上生成行號(hào)(而不是按部門),可以省略 PARTITION BY
子句:
SELECT
id,
department_id,
salary,
name,
row_number() OVER (ORDER BY salary DESC) AS emp_num
FROM
employees;
在這個(gè)查詢中,所有員工都將根據(jù)工資降序排列,并分配一個(gè)行號(hào)。