返回

看图说话,一文掌握最后 9 大 LOD 表达式

前端

  1. LAG()

LAG() 函数返回指定行之前的一行或多行的数据。语法如下:

LAG(expr, offset, default)
  • expr:要返回的表达式。
  • offset:要返回的行数。负值表示之前,正值表示之后。
  • default:如果指定的行不存在,则返回的默认值。

例如,以下查询返回每个部门中每个员工的前两名同事的姓名:

SELECT name,
       LAG(name, 2, 'No colleague') AS previous_colleague_2
FROM employees
ORDER BY department_id, hire_date;

10. LEAD()

LEAD() 函数返回指定行之后的一行或多行的数据。语法如下:

LEAD(expr, offset, default)
  • expr:要返回的表达式。
  • offset:要返回的行数。负值表示之前,正值表示之后。
  • default:如果指定的行不存在,则返回的默认值。

例如,以下查询返回每个部门中每个员工的后两名同事的姓名:

SELECT name,
       LEAD(name, 2, 'No colleague') AS next_colleague_2
FROM employees
ORDER BY department_id, hire_date;

11. FIRST_VALUE()

FIRST_VALUE() 函数返回一个窗口中第一行的数据。语法如下:

FIRST_VALUE(expr) OVER (partition_by_clause order_by_clause)
  • expr:要返回的表达式。
  • partition_by_clause:用于对数据进行分区的分区子句。
  • order_by_clause:用于对数据进行排序的排序子句。

例如,以下查询返回每个部门中第一个员工的姓名:

SELECT department_id,
       FIRST_VALUE(name) OVER (PARTITION BY department_id ORDER BY hire_date) AS first_employee
FROM employees;

12. LAST_VALUE()

LAST_VALUE() 函数返回一个窗口中最后一行的数据。语法如下:

LAST_VALUE(expr) OVER (partition_by_clause order_by_clause)
  • expr:要返回的表达式。
  • partition_by_clause:用于对数据进行分区的分区子句。
  • order_by_clause:用于对数据进行排序的排序子句。

例如,以下查询返回每个部门中最后一个员工的姓名:

SELECT department_id,
       LAST_VALUE(name) OVER (PARTITION BY department_id ORDER BY hire_date) AS last_employee
FROM employees;

13. NTH_VALUE()

NTH_VALUE() 函数返回一个窗口中第 N 行的数据。语法如下:

NTH_VALUE(expr, N) OVER (partition_by_clause order_by_clause)
  • expr:要返回的表达式。
  • N:要返回的行数。
  • partition_by_clause:用于对数据进行分区的分区子句。
  • order_by_clause:用于对数据进行排序的排序子句。

例如,以下查询返回每个部门中第三个员工的姓名:

SELECT department_id,
       NTH_VALUE(name, 3) OVER (PARTITION BY department_id ORDER BY hire_date) AS third_employee
FROM employees;

14. RANK()

RANK() 函数返回一个窗口中每个行的排名。语法如下:

RANK() OVER (partition_by_clause order_by_clause)
  • partition_by_clause:用于对数据进行分区的分区子句。
  • order_by_clause:用于对数据进行排序的排序子句。

例如,以下查询返回每个部门中每个员工的排名:

SELECT department_id,
       name,
       RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rank
FROM employees;

15. DENSE_RANK()

DENSE_RANK() 函数返回一个窗口中每个行的密集排名。语法如下:

DENSE_RANK() OVER (partition_by_clause order_by_clause)
  • partition_by_clause:用于对数据进行分区的分区子句。
  • order_by_clause:用于对数据进行排序的排序子句。

DENSE_RANK() 函数与 RANK() 函数的区别在于,DENSE_RANK() 函数不会跳过相同的排名。例如,以下查询返回每个部门中每个员工的密集排名:

SELECT department_id,
       name,
       DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rank
FROM employees;

希望这些内容对大家有帮助。如果您有任何问题,请随时与我联系。