使用 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,如何在时间序列中长时间间隔后删除案例?的主要内容,如果未能解决你的问题,请参考以下文章
如何在午夜 12:01 使用 Spring Boot 将间隔后的行添加到数据库 SQL 中
在 Oracle 内存缓存中长时间存储 PLSQL 存储过程值