DB2 :实施 LAG ROWS UNBOUNDED PRECEDING 和 UNBOUNDED FOLLOWING

DB2 : Implement LAG ROWS UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

如何在不支持它的 DB2 中实现 LAG(COL1) OVER(PARTITION BY ID ORDER BY TMST ROWS UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)。

我的意思是,我想根据 LAG 值派生一个列 (L_A_DATE),并且派生列应该继续具有以前的值,直到现有列不为 null

ID  COL1          STATUS         A_DATE          TMST
1   2020-08-08    OPEN            NULL        <current time>
1   2020-08-10    APPROVED     2020-08-09     <current time>
1   2020-08-13    OPEN            NULL        <current time>
1   2020-08-13    A_OPEN          NULL        <current time>
2   2020-08-08    OPEN            NULL        <current time>
2   2020-08-13    A_OPEN          NULL        <current time>
2   2020-08-15    APPROVED     2020-08-14     <current time>
2   2020-08-16    OPEN            NULL        <current time>
2   2020-08-16    W_OPEN          NULL        <current time>
2   2020-08-18    W_APPROVED   2020-08-17     <current time>
2   2020-08-19    OPEN            NULL        <current time>
2   2020-08-20    W_OPEN          NULL        <current time>

DB2 数据库中的所需输出

ID  COL1          STATUS         A_DATE        L_A_DATE              TMST
1   2020-08-08    OPEN            NULL           NULL            <current time>
1   2020-08-10    APPROVED     2020-08-09      2020-08-09        <current time>
1   2020-08-13    OPEN            NULL         2020-08-09        <current time>
1   2020-08-13    A_OPEN          NULL         2020-08-09        <current time>
2   2020-08-08    OPEN            NULL           NULL            <current time>
2   2020-08-13    A_OPEN          NULL           NULL            <current time>
2   2020-08-15    APPROVED     2020-08-14     2020-08-14         <current time>
2   2020-08-16    OPEN            NULL        2020-08-14         <current time>
2   2020-08-16    W_OPEN          NULL        2020-08-14         <current time>
2   2020-08-18    W_APPROVED   2020-08-17     2020-08-17         <current time>
2   2020-08-19    OPEN            NULL        2020-08-17         <current time>
2   2020-08-20    W_OPEN          NULL        2020-08-17         <current time>

您似乎需要最新的“批准”值:

select t.*,
       max(case when status = 'Approved' then a_date end) over (partition by id order by col1) as l_a_date
from t;

或者,您可以使用累积 max()(这是您想要的另一种解释):

select t.*,
       max(a_date) over (partition by id
                         order by col1 
                         rows between unbounded preceding and current row
                        ) as l_a_date
from t;