如果我有这样的数据,其中时间和日志事件的间隔不一致:
t1 data1
t2 data2
t3 log1
t4 data3
t5 log2
t6 data4
t7 data5
t8 data6
t9 data7
t10 log3如何获取日志事件之间的数据总和?例如:
t3 log1 sum(data 1-2)
t5 log2 sum(data 3)
t10 log3 sum(data 4-7)发布于 2021-08-22 01:57:04
既然您在标题中提到了时间,我猜t的值应该表示时间戳。我使用的是你的数据的修改版本:
key | timestamp | name | value
-----+------------------------+-------+-------
t1 | 2021-01-01 00:00:01-00 | data1 | 1
t2 | 2021-01-01 00:00:02-00 | data2 | 2
t3 | 2021-01-01 00:00:03-00 | log1 |
t4 | 2021-01-01 00:00:04-00 | data3 | 3
t5 | 2021-01-01 00:00:05-00 | log2 |
t6 | 2021-01-01 00:00:06-00 | data4 | 4
t7 | 2021-01-01 00:00:07-00 | data5 | 5
t8 | 2021-01-01 00:00:08-00 | data6 | 6
t9 | 2021-01-01 00:00:09-00 | data7 | 7
t10 | 2021-01-01 00:00:10-00 | log3 |第一步是找出范围是什么。我们可以只查询"log“行,并使用LAG窗口函数将它们转换为时间范围:
SELECT
key,
name,
tstzrange(LAG(timestamp) OVER (ORDER BY timestamp), timestamp) as timerange
FROM your_table
WHERE name LIKE 'log%';
key | name | timerange
-----+------+-----------------------------------------------------
t3 | log1 | (,"2021-01-01 00:00:03-00")
t5 | log2 | ["2021-01-01 00:00:03-00","2021-01-01 00:00:05-00")
t10 | log3 | ["2021-01-01 00:00:05-00","2021-01-01 00:00:10-00")然后,步骤2是使用这些时间范围对数据行进行分组。注意@>操作符,它检查时间戳是否在时间范围内:
WITH ranges AS (
SELECT
key,
name,
tstzrange(LAG(timestamp) OVER (ORDER BY timestamp), timestamp) as timerange
FROM your_table
WHERE name LIKE 'log%'
)
SELECT
ranges.key,
ranges.name,
SUM(value)
FROM your_table
JOIN ranges ON (ranges.timerange @> your_table.timestamp)
WHERE your_table.name LIKE 'data%'
GROUP BY ranges.key, ranges.name;
key | name | sum
-----+------+-----
t3 | log1 | 3
t5 | log2 | 3
t10 | log3 | 22https://stackoverflow.com/questions/68877287
复制相似问题