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
我现在的问题是
我想在 FRGKZ 列从 2 到 4 发生变化时检索所有 BANFN 基础
然后是另一列,我想从 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
且之前的 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
我想从我的 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
我现在的问题是
我想在 FRGKZ 列从 2 到 4 发生变化时检索所有 BANFN 基础
然后是另一列,我想从 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
且之前的 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