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 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