使用 ROW_NUMBER 函数选择最后一行
Posted
技术标签:
【中文标题】使用 ROW_NUMBER 函数选择最后一行【英文标题】:Select last row using ROW_NUMBER function 【发布时间】:2019-11-03 19:45:39 【问题描述】:我只是想知道是否有任何方法可以根据 ROW_NUMBER() 函数选择最后一行?基本上我想为每个department_id选择最后一个(最多一个)emp_id。
SELECT
department_id, last_name, employee_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id
FROM
employees;
输出:
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID
------------- ------------------------- ----------- ----------
10 Whalen 200 1
20 Hartstein 201 1
20 Fay 202 2
30 Raphaely 114 1
30 Khoo 115 2
30 Baida 116 3
30 Tobias 117 4
30 Himuro 118 5
30 Colmenares 119 6
40 Mavris 203 1
. . .
100 Popp 113 6
110 Higgins 205 1
110 Gietz 206 2
【问题讨论】:
【参考方案1】:是的,您可以添加降序,然后使用该列进行过滤:
SELECT *
FROM (
SELECT department_id, last_name, employee_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id DESC) l_emp_id
FROM employees
)
WHERE l_emp_id = 1
【讨论】:
【参考方案2】:在每个分区内ORDER BY employee_id DESC
之后使用您的查询并过滤以获取每个组的第一行:
SELECT t.department_id, t.last_name, t.employee_id
FROM (
SELECT department_id, last_name, employee_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id DESC) rn
FROM employees
) t
WHERE t.rn = 1
请参阅demo。 结果:
> DEPARTMENT_ID | LAST_NAME | EMPLOYEE_ID
> ------------: | :--------- | ----------:
> 10 | Whalen | 200
> 20 | Fay | 202
> 30 | Colmenares | 119
> 40 | Mavris | 203
> 100 | Popp | 113
> 110 | Gietz | 206
【讨论】:
以上是关于使用 ROW_NUMBER 函数选择最后一行的主要内容,如果未能解决你的问题,请参考以下文章
查询性能:CTE 使用 ROW_NUMBER() 选择第一行
Redshift中的ROW_NUMBER()从每个组中选择最大的行?
Oracle:row_number()rank()dense_rank()
使用带有 Spark 版本 2.2 的 row_number() 函数在 PySpark DataFrame 中创建每一行的行号