MySQL 原生sql实现oracle 中的 lag(, 3, ) over() 函数
时间: 2023-12-28 11:03:22 浏览: 134
MySQL与Oracle差异比较之三 函数
在 MySQL 中,可以使用子查询和变量来模拟实现 Oracle 中的 LAG 函数。
假设有一个表 t,其中包含列 col1 和 col2,我们要在 col2 中计算每个值向前第 3 行的值。可以使用以下 SQL 语句:
```
SELECT
col1,
col2,
(SELECT col2 FROM t t2 WHERE t2.col1 < t.col1 ORDER BY t2.col1 DESC LIMIT 1 OFFSET 2) AS prev_col2
FROM t;
```
此查询将使用子查询获取每个行的前三个值,并使用 OFFSET 2 选择第三个值。使用 ORDER BY 子句可以确保结果与 Oracle 中的 LAG 函数一致。
如果需要在查询中多次使用此逻辑,则可以将其封装在一个变量中以提高效率,如下所示:
```
SET @prev_col2 := NULL;
SELECT
col1,
col2,
@prev_col2 := IF(@prev_col2 IS NULL, col2, prev_col2) AS prev_col2
FROM t;
```
此查询将使用变量 @prev_col2 存储前一个值,并在每一行计算 prev_col2。如果 @prev_col2 为空,则使用当前行的 col2。否则,使用上一行的 prev_col2 值。
请注意,这种方法可能比 LAG 函数更慢,因为它需要使用子查询和变量。如果您需要对大量数据进行操作,则应该考虑使用其他方法。
阅读全文