如何通過row_number實(shí)現(xiàn)窗口函數(shù)

小樊
81
2024-10-12 12:23:13

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)。

0