绘制过去一周的叠加数据

问题描述 投票:0回答:1

我下面有一个非常简单的查询。我可以将其添加到我的 Grafana 中并绘制一个图表,代表 1 小时间隔内的活动,如果我添加时间过滤器,我可以将其范围限制到今天。一切都好。

SELECT timestamp as time, server, count(rate)
FROM
  mytable
WHERE
    server = 'mysrv'  SAMPLE BY 1h

然后我可以更改时间过滤器以显示过去 7 天,但在这种情况下,我会按顺序查看每天的活动,这当然是有意义的。我更喜欢将过去 7 天的每一天叠加在当天之上,这样我就可以比较每天在给定时间的活动。

我认为这很容易,但是在使用窗口函数、联合和我能想到的所有东西尝试运气之后,并没有找到可行的解决方案。我感觉我可以做一些日期算术来规范化这一点,但无法真正找到方法。

sql database time-series questdb
1个回答
0
投票

一些日期算术,我们就完成了。

在第一个子查询(采样)中,我只是过滤过去 7 天并每小时进行一次采样。

在下一个(sampled_offsets)中,我们可以计算每行与今天之间的天数差异。我正在使用这个sql

 datediff('d',  timestamp_floor('d',timestamp),  timestamp_floor('d',now())) as days_ago
。请注意,我不想知道天数的真正差异。如果我今天上午 9 点运行此命令,并且我在昨天晚上 11 点有一行,我希望差异为“1”,以知道该行属于 1 天前,即使从技术上讲,这是在 24 小时内。因此,我在两个时间戳上使用
timestamp_floor
来获得正确的偏移量。

现在,在下一个子查询(规范化)中,我可以向每行时间戳添加天数偏移量,因此我将数据叠加起来,就像今天发生的一样,但时间戳正确。在这个查询之后,我会有只显示今天日期的行,但有一个

days_ago
列告诉我实际上它属于不同的一天。

现在在最后

SELECT
我可以旋转结果,按时间和服务器分组(在QuestDB中隐式),然后根据天数的偏移量分配到正确的列。

最终结果有 24 行,一行代表一天中的每小时,还有 7 列,每列代表过去 7 天中每一天的特定时间戳的平均值。

WITH sampled AS (
SELECT timestamp, server, avg(rate) as rate
FROM  mytable
WHERE server = 'Calumet Beach'
AND ( timestamp >= dateadd('d', -7, timestamp_floor('d', now())) AND timestamp < timestamp_ceil('d', now()) )
SAMPLE by 1h FILL(NULL)
), sampled_offsets AS (
SELECT timestamp, server, rate, 
  datediff('d',  timestamp_floor('d',timestamp),  timestamp_floor('d',now())) as days_ago
from sampled
  ),
  normalized AS (
SELECT server, rate, dateadd('d', days_ago::int, timestamp) as time,timestamp, days_ago
from sampled_offsets
)
select time, server, 
SUM(CASE WHEN days_ago = 0 THEN rate END) AS rate_current,
SUM(CASE WHEN days_ago = 1 THEN rate END) AS rate_1_ago,
SUM(CASE WHEN days_ago = 2 THEN rate END) AS rate_2_ago,
SUM(CASE WHEN days_ago = 3 THEN rate END) AS rate_3_ago,
SUM(CASE WHEN days_ago = 4 THEN rate END) AS rate_4_ago,
SUM(CASE WHEN days_ago = 5 THEN rate END) AS rate_5_ago,
SUM(CASE WHEN days_ago = 6 THEN rate END) AS rate_6_ago,
 from normalized
;

现在,如果我执行此查询,我可以将每一列绘制为不同的系列,并且它们在时间上重叠。

Chart representing a timeseries per day at hourly intervals

© www.soinside.com 2019 - 2024. All rights reserved.