PostgreSQL TimescaleDB按时间分桶并补全多src-dest组缺失数据
PostgreSQL TimescaleDB 查询需求
数据库表结构
现有一张大型TimescaleDB表,结构及示例数据如下:
| src | dest | traffic | timestamp (类型: timestamp) |
|---|---|---|---|
| a | b | 200 | 2022-12-11 00:23:51.000 |
| a | b | 200 | 2022-12-11 00:32:01.000 |
| b | a | 200 | 2022-12-11 00:49:01.000 |
| a | c | 200 | 2022-12-11 11:39:01.000 |
| a | b | 200 | 2022-12-11 11:57:01.000 |
| a | b | 20 | 2022-12-11 21:32:01.000 |
查询要求
需要实现以下查询逻辑:
- 对指定的src-dest对的
traffic字段求和,支持查询单个对(如a->b)或多个对(如a->b和a->c),每个src-dest对视为唯一(a->b与b->a是不同的对) - 将数据按指定时间范围(例如
2022-12-11 00:25:00.000至2022-12-11 19:35:00.000)分成24个等宽时间桶(例如50分钟/桶),结果必须满足:- 每个src-dest对应的所有24个时间桶都要出现在结果中(Timescale原生的
time_bucket函数无法满足此要求) - 第一个时间桶的起始时间必须是指定的查询起始时间(Timescale原生的
time_bucket_gapfill函数无法满足此要求) - 查询语句需要支持多src-dest对的筛选,例如使用
WHERE ((src = 'a' and dest = 'b') or (src = 'a' and dest = 'c'))
- 每个src-dest对应的所有24个时间桶都要出现在结果中(Timescale原生的
示例输出(与上述示例输入无关)
以a->b对为例,查询结果需包含24个起始于00:25:00的时间桶,若某段时间无流量数据,对应桶的traffic值为NULL:
| time_bucket | src | dest | traffic |
|---|---|---|---|
| 2022-12-11 00:25:00.000 +0200 | a | b | 48614 |
| 2022-12-11 01:15:00.000 +0200 | a | b | 49228 |
| 2022-12-11 02:05:00.000 +0200 | a | b | 49228 |
| 2022-12-11 02:55:00.000 +0200 | a | b | 48614 |
| 2022-12-11 03:45:00.000 +0200 | a | b | 49228 |
| 2022-12-11 04:35:00.000 +0200 | a | b | 49119 |
| 2022-12-11 05:25:00.000 +0200 | a | b | 27288 |
| 2022-12-11 06:15:00.000 +0200 | a | b | 26054 |
| 2022-12-11 07:05:00.000 +0200 | a | b | 25735 |
| 2022-12-11 07:55:00.000 +0200 | a | b | 25360 |
| 2022-12-11 08:45:00.000 +0200 | a | b | 26748 |
| 2022-12-11 09:35:00.000 +0200 | a | b | 24787 |
| 2022-12-11 10:25:00.000 +0200 | a | b | 23065 |
| 2022-12-11 11:15:00.000 +0200 | a | b | 20629 |
| 2022-12-11 11:55:00.000 +0200 | a | b | NULL |
| 2022-12-11 12:45:00.000 +0200 | a | b | NULL |
| .... | a | b | NULL |
| 2022-12-12 19:35:00.000 | a | b | NULL |
内容的提问来源于stack exchange,提问作者zerohedge
相关产品推荐
相关产品推荐

