使用滞后函数的 SQL

Posted

技术标签:

【中文标题】使用滞后函数的 SQL【英文标题】:SQL using lag function 【发布时间】:2020-08-24 15:59:14 【问题描述】:

我想做的是使用以下规则创建一个列“ID_DESLIG”:

当 STATE 为 'LIGADO' 时,ID_DESLIG 将是前一个 STATE 为 'DESLIGADO' 的 id,对于同一个面板;

当 STATE 为 'DESLIGADO' 时,ID_DESLIG 将是当前行的 id;

我想要的一个例子

提前感谢您的帮助

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

我想你想要:

select t.*,
       (case when state = 'DESLIGADO' then id
             else max(case when state = 'DESLIGADO' then id end) over (order by id)
        end) as desligado_id
from t;

反过来,这可以简化为:

max(case when state = 'DESLIGADO' then id end) over (order by id)

您可以使用 lag() 来表达这一点,但前提是您知道状态始终是交错的。

在标准 SQL(和一些数据库)中,这也可以表示为:

max(id) filter (where state = 'DESLIGADO') over (order by id)

【讨论】:

首先,感谢您的帮助。我试过了,它只将信息放在状态为“Desligado”的行上。它也应该放在 state = 'Ligado' 的地方 @Shabbir 。 . .所有这些都应该适用于所有行。 我的错误是我应该使用“LIKE”而不是“=”。再次感谢!

以上是关于使用滞后函数的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

使用滞后函数在 SQL 中查找移动平均线

如何使用具有两列的 Hive sql 滞后函数?

SQL - Redshift 滞后函数获取重复项

Spark SQL:窗口函数滞后直到满足条件

使用滞后函数(TSQL)返回0获得销售差异

基于另一列中的值的一列上的pyspark滞后函数