Sqlite 查询以检索由于特定列而更改的所有记录

Sqlite query to retrieve all the records that have changed due to a certain column

我想从我的 table 中检索所有记录,这些记录在我的 table 的其中一列中发生了状态更改。请查看以下 table :

   BANFN    BSART   FRGKZ           ERNAM   ERDAT
   11111111 NB      2                A      1533247200
   11111111 NB      4                A      1534111200
   22222222 NB      2                C      1548111600
   22222222 NB      4                C      1559858400
   33333333 NB      2                D      1559858400
   33333333 NB      4                D      1559858400
   44444444 NB      2                E      1559858400

我现在的问题是

  1. 我想在 FRGKZ 列从 2 到 4 发生变化时检索所有 BANFN 基础

  2. 然后是另一列,我想从 ERDAT 字段中查看这两个事件之间的滞后时间,该字段采用 Unix 时间戳格式

Sor 例如,对于第一个 BANFN 11111111,输出应如下所示:

    BANFN    ERNAM BSART   LAG_In_Between                           Final_Status_FRGKZ
    11111111   A      NB   ERDAT at status 4 - ERDAT at status 2     4

输出应包含以下列:

BANFN ERNAM BSART LAG_In_Between Final_Status_FRGKZ

这是一个方便使用的地方lag():

select t.*, (erdate - prev_erdat)
from (select t.*,
             lag(frgkz) over (partition by banfn order by erdat) as prev_frgkz,
             lag(frgkz) over (partition by banfn order by erdat) as prev_erdat
      from t
      where frgkz in (2, 4)
     ) t
where frgkz = 4 and prev_frgkz = 2;

Here 是一个 db<>fiddle.

请注意,过滤非常重要。子查询过滤为“2"s and "4"s, so the previous is always a "2”或“4”。

外部查询只returns "4"s where the previous is a "2".

您可以使用 lag() 两次:一次用于获取与前一个 erdat 的差异,用于相同的 banfn,一次用于获取前一个 fgrkz。外部查询筛选 fgrkz 设置为 2 且之前的 fgrkz4.

的记录
select
    banfn, 
    ernam, 
    bsart, 
    lag_in_between,
    fgrkz final_status_frgkz
from (
    select 
        t.*,
        erdat - lag(erdat) over(partition by banfn order by erdat) lag_in_between
        lag(fgrkz) over(partition by banfn order by erdat) lag_fgrkz
    from mytable t
) t
where fgrkz = 4 and lag_fgrkz = 2