在初始时间3小时后对数据进行分组

8ulbf1ek  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(262)

我需要能够过滤数据集,每3小时只显示第一个示例。如果找到一个示例,则应隐藏其后3小时内发生的任何其他示例。
我能找到的就是 date_trunc 每小时得到一次初审,但我需要在初审后3个小时内具体隐藏。
示例数据:

+------------------------+-------+
|       Timestamp        | Value |
+------------------------+-------+
| "2015-12-29 13:35:00"  |    65 |
| "2015-12-29 13:40:00"  |    26 |
| "2015-12-29 13:45:00"  |    80 |
| "2015-12-29 13:50:00"  |    10 |
| "2015-12-29 16:40:00"  |    76 |
| "2015-12-29 16:45:00"  |    73 |
| "2016-01-04 08:05:00"  |    87 |
| "2016-01-04 08:10:00"  |    90 |
| "2016-01-04 08:15:00"  |    52 |
| "2016-01-04 08:20:00"  |    90 |
| "2016-01-04 08:25:00"  |    23 |
| "2016-01-04 08:30:00"  |    96 |
| "2016-01-04 13:35:00"  |    53 |
| "2016-01-04 13:40:00"  |    15 |
| "2016-01-04 13:45:00"  |    85 |
+------------------------+-------+

预期结果:

+------------------------+-------+
|       Timestamp        | Value |
+------------------------+-------+
| "2015-12-29 13:35:00"  |    65 |
| "2015-12-29 16:40:00"  |    76 |
| "2016-01-04 08:05:00"  |    87 |
| "2016-01-04 13:30:00"  |     7 |
+------------------------+-------+

Anyone have any ideas? Thank you so much for your help.
bvhaajcl

bvhaajcl1#

这是一个棘手的问题,因为您需要跟踪最后一个选择的记录,以确定下一个-所以您不能只是 group by 每隔3小时。
下面是一种使用递归cte的方法:

with recursive cte(ts, value) as (
    select ts, value
    from mytable
    where ts = (select min(ts) from mytable)
    union all
    select x.*
    from (select ts from cte order by ts desc limit 1) c
    cross join lateral (
        select t.ts, t.value
        from mytable t
        where t.ts >= c.ts + interval '3' hour
        order by t.ts
        limit 1
    ) x
)
select * from cte order by ts

其思想是从表中最早的记录开始,然后通过选取至少3小时后的第一条可用记录进行迭代(这假设timestamp列中没有重复的记录)。
请注意 timestamp 不是一个好的列名选择,因为它与语言关键字(即数据类型)冲突。我把它发回监狱 ts 在查询中。
db小提琴演示:

ts                  | value
:------------------ | ----:
2015-12-29 13:35:00 |    65
2015-12-29 16:40:00 |    76
2016-01-04 08:05:00 |    87
2016-01-04 13:35:00 |    53

相关问题