SQL Server LAG() 函数使用指南

SQL Server LAG() 函数是一种窗口函数,可以用于在查询结果集中访问前一行数据。该函数可用于计算当前行和前一行之间的差异,或者将前一行的数据与当前行数据进行比较。 LAG() 函数在分析数据时非常有用,可以帮助分析人员识别出数据中的趋势和模式。

语法

LAG() 函数的语法如下:

LAG(expression [,offset] [,default]) OVER ( [partition_by_clause] order_by_clause )

其中:

  • expression:要访问前一行数据的列或表达式。
  • offset:要访问的前一行的偏移量,默认为 1。例如,如果 offset 为 2,则 LAG() 函数将访问前两行数据。
  • default:如果要访问的前一行数据不存在,则使用的默认值。默认为 NULL。
  • partition_by_clause:可选参数,用于分组数据的列或表达式。
  • order_by_clause:用于指定查询结果集中的列或表达式的排序顺序。

使用场景

LAG() 函数适用于以下场景:

  • 计算当前行和前一行之间的差异。
  • 将前一行的数据与当前行数据进行比较。
  • 识别数据中的趋势和模式。
  • 在分析数据时使用滑动窗口函数。

示例

下面是 LAG() 函数的两个示例,包括示例数据和结果。

示例 1

假设有一个名为 sales 的表,其中包含以下数据:

year quarter sales
2020 Q1 100
2020 Q2 200
2020 Q3 300
2020 Q4 400
2021 Q1 500
2021 Q2 600
2021 Q3 700
2021 Q4 800

我们可以使用 LAG() 函数计算每个季度的销售额增长率。下面是查询语句和结果:

SELECT year,
  quarter,
  sales,
  LAG(sales, 1) OVER (
    ORDER BY year,
      quarter
  ) AS prev_sales,
  (
    sales - LAG(sales, 1) OVER (
      ORDER BY year,
        quarter
    )
  ) / LAG(sales, 1) OVER (
    ORDER BY year,
      quarter
  ) AS growth_rate
FROM sales;

查询结果:

year quarter sales prev_sales growth_rate
2020 Q1 100 NULL NULL
2020 Q2 200 100 1.0000
2020 Q3 300 200 0.5000
2020 Q4 400 300 0

示例 2

假设有一个名为 employees 的表,其中包含以下数据:

employee_id department salary
1 A 5000
2 A 6000
3 B 7000
4 B 8000
5 B 9000
6 C 10000

我们可以使用 LAG() 函数计算每个部门中员工的工资增长率。下面是查询语句和结果:

SELECT employee_id,
  department,
  salary,
  LAG(salary, 1, 0) OVER (
    PARTITION BY department
    ORDER BY salary
  ) AS prev_salary,
  (
    salary - LAG(salary, 1, 0) OVER (
      PARTITION BY department
      ORDER BY salary
    )
  ) / LAG(salary, 1, 0) OVER (
    PARTITION BY department
    ORDER BY salary
  ) AS growth_rate
FROM employees;

查询结果:

employee_id department salary prev_salary growth_rate
1 A 5000 0 0
2 A 6000 5000 0.2000
3 B 7000 0 0
4 B 8000 7000 0.1429
5 B 9000 8000 0.1250
6 C 10000 0 0

结论

LAG() 函数是一种非常有用的窗口函数,可以用于在查询结果集中访问前一行数据。该函数适用于计算当前行和前一行之间的差异,或者将前一行的数据与当前行数据进行比较。使用 LAG() 函数可以帮助分析人员识别出数据中的趋势和模式,从而更好地理解数据。