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

Sqlite查询以检索由于某个列而更改的所有记录,sql,sqlite,datetime,subquery,unix-timestamp,Sql,Sqlite,Datetime,Subquery,Unix Timestamp,我想从我的表中检索所有记录,其中状态更改发生在我表中的一列中。请查看下表: BANFN BSART FRGKZ ERNAM ERDAT 11111111 NB 2 A 1533247200 11111111 NB 4 A 1534111200 22222222 NB 2 C 15481116

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

   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
我现在的问题是

  • 我想检索所有的BANFN基,只要FRGKZ列从2变为4

  • 然后是另一个专栏,我想从ERDAT字段中看到这两个事件之间的延迟,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\u In\u处于最终状态之间FRGKZ

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

    他是一把小提琴

    请注意,过滤非常重要。子查询只过滤到“2”和“4”,因此前一个总是“2”或“4”

    外部查询仅返回“4”,其中上一个是“2”。

    您可以使用
    lag()
    两次:一次获得与相同
    banfn
    的上一个
    erdat
    的差异,一次获得上一个
    fgrkz
    。外部查询将筛选
    fgrkz
    设置为
    2
    且其先前的
    fgrkz
    4
    的记录

    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
    

    FRGKZ
    是否还有其他值?中间可以有行吗?@GordonLinoff:只有一个值“1”,但这不是必需的。我收到一个语法错误,但查询看起来很好。你介意再检查一下吗?同样在第一个select语句中,我只需要Final_Status_FRGKZ,它给出了FRGKZ字段的最终值。我正在使用的SQLite DB studio说它没有识别函数滞后。我得到了一个语法错误,但对我来说,查询看起来很好。只有在第一个select语句中,我才能将(erdat-prev_dat)的别名创建为lag_date或其他内容。但我不确定这为什么会造成语法错误。我正在使用的SQLite DB studio说它没有识别函数滞后。@Django0602。您使用的是不支持
    lag()
    的较旧版本的SQLite吗?我不这么认为。。。我有最新版本的SQLite DB studio。。3.2.1是否有我缺少的任何其他更新版本?如果是SQLite版本,则该版本实际上相对较旧。窗口函数是在3.25中引入的。@Django0602。它在sqlfiddle中工作。我添加了一个链接。
    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