lag()和lead()的用法,详细说明并举例
时间: 2023-08-23 10:05:59 浏览: 303
`LAG()`和`LEAD()`是Oracle数据库中的窗口函数,它们可以用来获取指定行的上一行或下一行的值,可以在SQL查询中进行偏移计算,是进行时间序列分析的重要函数。
`LAG()`函数用于获取当前行之前的一行数据,常用于计算前一行与当前行之间的差值、变化率等,其语法如下:
```sql
LAG(column, offset, default) OVER (ORDER BY ...);
```
其中,`column`是要获取的列名,`offset`是偏移量,表示要获取的是当前行之前的第几行数据,`default`是可选参数,表示当获取的数据为空值时返回的默认值。`ORDER BY`子句用于指定排序规则。
举个例子,假设我们有一个`sales`表,其中记录了每个店铺每个月的销售额,我们可以使用`LAG()`函数计算出每个店铺上个月的销售额和销售额变化率,如下所示:
```sql
SELECT store, month, sales,
LAG(sales, 1, 0) OVER (PARTITION BY store ORDER BY month) AS last_month_sales,
(sales - LAG(sales, 1, 0) OVER (PARTITION BY store ORDER BY month)) / LAG(sales, 1, 1) OVER (PARTITION BY store ORDER BY month) AS sales_growth_rate
FROM sales;
```
上面的查询中,我们使用了`LAG()`函数获取了每个店铺前一个月的销售额,然后计算出了销售额的变化率。
`LEAD()`函数与`LAG()`函数类似,用于获取当前行之后的一行数据,其语法如下:
```sql
LEAD(column, offset, default) OVER (ORDER BY ...);
```
下面是一个使用`LEAD()`函数的例子,假设我们有一个`logs`表,其中记录了每个用户的登录时间,我们可以使用`LEAD()`函数计算出每个用户相邻两次登录时间的时间差,如下所示:
```sql
SELECT user_id, login_time,
LEAD(login_time) OVER (PARTITION BY user_id ORDER BY login_time) - login_time AS time_diff
FROM logs;
```
上面的查询中,我们使用了`LEAD()`函数获取了每个用户下一次登录的时间,然后计算出了相邻两次登录时间的时间差。
阅读全文