我有一个 Timescale DB / PostgreSQL 表(DataTable),看起来像这样
我正在尝试找到一个查询,该查询将为不同的子系统/指标组合返回不同的列,如下所示
此外,我想使用 Timescale DB 函数 time_bucket_gapfill() 减少请求的数据点的数量,以在大时间范围内保持较低的响应时间。我还想为不同的子系统/指标组合使用不同的聚合函数。我使用查询的数据在 Grafana 中绘制曲线。实现这一目标最省时的方法是什么?
目前,我对每个指标使用单独的查询,这很快就会变得非常慢。例如,查询可能看起来像这样
SELECT
time_bucket_gapfill('30s',time,start=>'2021-07-19T09:06:26.605Z',finish=>'2021-07-19T20:11:12.340Z') AS "time",
max(value) AS "Latitude"
FROM DataTable
WHERE
time BETWEEN '2021-07-19T09:06:26.605Z' AND '2021-07-19T20:11:12.340Z' AND
subsystem = 'position' AND
metric = 'lat'
GROUP BY 1,metric,subsystem
ORDER BY time
SELECT
time_bucket_gapfill('30s',time,start=>'2021-07-19T09:06:26.605Z',finish=>'2021-07-19T20:11:12.340Z') AS "time",
min(value) AS "Longitude"
FROM DataTable
WHERE
time BETWEEN '2021-07-19T09:06:26.605Z' AND '2021-07-19T20:11:12.340Z' AND
subsystem = 'position' AND
metric = 'lon'
GROUP BY 1,metric,subsystem
ORDER BY time
SELECT
time_bucket_gapfill('30s',time,start=>'2021-07-19T09:06:26.605Z',finish=>'2021-07-19T20:11:12.340Z') AS "time",
avg(value) AS "Temperature"
FROM DataTable
WHERE
time BETWEEN '2021-07-19T09:06:26.605Z' AND '2021-07-19T20:11:12.340Z' AND
subsystem = 'health' AND
metric = 'temperature'
GROUP BY 1,metric,subsystem
ORDER BY time
如果有人能指出我正确的方向,我将不胜感激。
更新:
使用@Charlieface 建议的 FILTER 子句对我不起作用,因为它不会删除其他行,而是将 NULL 放在那里。这是一个包含一些真实数据的示例(之前的示例使用了简化的数据和名称)。
我还注意到,属于一起的指标的时间戳有微小的差异,这会阻止不同的指标位于同一行,但这很容易在将数据输入数据库的单元中进行更改。
更新 2:
时间戳问题已修复,并按照@Charlieface 的建议再次添加了 WHERE 语句,但数据中仍然存在 NULL,这使得 Grafana 绘制数据点之间没有线条。
我希望结果看起来像这样。
更新 3:
我错过了@Charlieface 只按时间分组回答。如果我这样做,那么我会得到我想要的结果。