使用 SQL,如何在时间序列中长时间间隔后删除案例?

Posted

技术标签:

【中文标题】使用 SQL,如何在时间序列中长时间间隔后删除案例?【英文标题】:with SQL, how to drop cases after a long gap in a time series? 【发布时间】:2021-12-15 14:53:05 【问题描述】:

我的数据看起来像这样:

CASE_TIMESTAMP GROUP
0 2017-12-26 16:12:09+00:00 A
1 2017-12-26 16:12:44+00:00 A
2 2020-04-21 07:00:00+00:00 A
3 2020-07-01 00:05:35+00:00 A
4 2020-08-06 07:00:00+00:00 A
5 2020-08-06 07:00:00+00:00 A
6 2020-08-06 07:00:00+00:00 A
7 2020-08-25 07:00:00+00:00 B
8 2020-09-22 07:00:00+00:00 B
9 2020-09-22 07:00:00+00:00 B
10 2020-12-04 08:00:00+00:00 B
11 2020-12-04 08:00:00+00:00 B
12 2020-12-07 08:00:00+00:00 B
13 2020-12-07 08:00:00+00:00 B
14 2020-12-07 08:00:00+00:00 B
15 2020-12-08 08:00:00+00:00 B
16 2020-12-08 08:00:00+00:00 B
17 2020-12-08 08:00:00+00:00 B

需要删除间隔超过 1 天之前发生的病例,因此 A 组为 2020 年 8 月 6 日之前的病例,B 组为 2020 年 12 月 7 日之前的病例。

认为我需要一个窗口函数,但不知道如何计算间隙然后全部丢弃,有什么想法吗?

PS.我在雪花上

【问题讨论】:

【参考方案1】:

使用 QUALIFY 和窗口化 MAX 查找每个 GRR 的最新 CASE_TIMESTAMP:

CREATE TABLE t(CASE_TIMESTAMP TIMESTAMP,    GRP VARCHAR)
AS
          SELECT '2017-12-26 16:12:09+00:00','A'
UNION ALL SELECT '2017-12-26 16:12:44+00:00','A'
UNION ALL SELECT '2020-04-21 07:00:00+00:00','A'
UNION ALL SELECT '2020-07-01 00:05:35+00:00','A'
UNION ALL SELECT '2020-08-06 07:00:00+00:00','A'
UNION ALL SELECT '2020-08-06 07:00:00+00:00','A'
UNION ALL SELECT '2020-08-06 07:00:00+00:00','A'
UNION ALL SELECT '2020-08-25 07:00:00+00:00','B'
UNION ALL SELECT '2020-09-22 07:00:00+00:00','B'
UNION ALL SELECT '2020-09-22 07:00:00+00:00','B'
UNION ALL SELECT '2020-12-04 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-04 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-07 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-07 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-07 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-08 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-08 08:00:00+00:00','B'
UNION ALL SELECT '2020-12-08 08:00:00+00:00','B';

查询:

SELECT *
FROM t
QUALIFY CASE_TIMESTAMP >= MAX(CASE_TIMESTAMP) OVER(PARTITION BY GRP) 
                          - INTERVAL '1 days';

输出:

【讨论】:

以上是关于使用 SQL,如何在时间序列中长时间间隔后删除案例?的主要内容,如果未能解决你的问题,请参考以下文章

如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?

如何在午夜 12:01 使用 Spring Boot 将间隔后的行添加到数据库 SQL 中

在 Oracle 内存缓存中长时间存储 PLSQL 存储过程值

如何监控Oracle数据库中长时间运行的进程

在 SQL Server 2008 中通过联接在更新表中长时间执行

如何在 SQL Server 中删除不精确的重复项