使用 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()从每个组中选择最大的行?

使用 ROW_NUMBER() 窗口函数选择行

Oracle:row_number()rank()dense_rank()

使用带有 Spark 版本 2.2 的 row_number() 函数在 PySpark DataFrame 中创建每一行的行号