SQL 日期智能:从最后一个已知的有效结果按秒 运行 过滤数据
SQL Date intelligence: filtering data by seconds ran from last known valid result
求助!我们正在尝试创建一个新列(是否有效?)以重现以下逻辑。
这是一个二进制结果:
如果它是 ID 的第一个已知值,则为 1
如果比该ID的前一个“1”晚3秒或更晚则为1
注1:这不是与之前记录相差的秒数
- 如果比该ID的前一个“1”少3秒则为0
注2:数据集中ID较多
注3:原始数据集有ID和Date
附上数据的 PoC 和预期结果。
您必须使用递归 CTE 来执行此操作,这非常昂贵:
with tt as (
select t.*, row_number() over (partition by id order by time) as seqnum
from t
),
recursive cte as (
select t.*, time as grp_start
from tt
where seqnum = 1
union all
select tt.*,
(case when tt.time < cte.grp_start + interval '3 second'
then tt.time
else tt.grp_start
end)
from cte join
tt
on tt.seqnum = cte.seqnum + 1
)
select cte.*,
(case when grp_start = lag(grp_start) over (partition by id order by time)
then 0 else 1
end) as isValid
from cte;
求助!我们正在尝试创建一个新列(是否有效?)以重现以下逻辑。
这是一个二进制结果:
如果它是 ID 的第一个已知值,则为 1
如果比该ID的前一个“1”晚3秒或更晚则为1
注1:这不是与之前记录相差的秒数
- 如果比该ID的前一个“1”少3秒则为0
注2:数据集中ID较多
注3:原始数据集有ID和Date
附上数据的 PoC 和预期结果。
您必须使用递归 CTE 来执行此操作,这非常昂贵:
with tt as (
select t.*, row_number() over (partition by id order by time) as seqnum
from t
),
recursive cte as (
select t.*, time as grp_start
from tt
where seqnum = 1
union all
select tt.*,
(case when tt.time < cte.grp_start + interval '3 second'
then tt.time
else tt.grp_start
end)
from cte join
tt
on tt.seqnum = cte.seqnum + 1
)
select cte.*,
(case when grp_start = lag(grp_start) over (partition by id order by time)
then 0 else 1
end) as isValid
from cte;