首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对位于不一致时间范围之间的数据求和?

如何对位于不一致时间范围之间的数据求和?
EN

Stack Overflow用户
提问于 2021-08-21 22:50:58
回答 1查看 41关注 0票数 0

如果我有这样的数据,其中时间和日志事件的间隔不一致:

代码语言:javascript
运行
复制
t1   data1
t2   data2
t3 log1
t4   data3
t5 log2
t6   data4
t7   data5
t8   data6
t9   data7
t10 log3

如何获取日志事件之间的数据总和?例如:

代码语言:javascript
运行
复制
t3 log1 sum(data 1-2)
t5 log2 sum(data 3)
t10 log3 sum(data 4-7)
EN

回答 1

Stack Overflow用户

发布于 2021-08-22 01:57:04

既然您在标题中提到了时间,我猜t的值应该表示时间戳。我使用的是你的数据的修改版本:

代码语言:javascript
运行
复制
 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窗口函数将它们转换为时间范围:

代码语言:javascript
运行
复制
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是使用这些时间范围对数据行进行分组。注意@>操作符,它检查时间戳是否在时间范围内:

代码语言:javascript
运行
复制
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 |  22
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68877287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档