具有最大结果数量的 SQL 时间序列组

gsm*_*515 6 sql group-by timescaledb

我使用 Timescaledb 在表中保存了时间序列数据。

数据如下:

    time                    locationid parameterid unitid value
2022-04-18T10:00:00.000Z      "1"        "1"        "2"    2.2
2022-04-18T10:00:00.000Z      "2"        "1"        "2"    3.0
2022-04-18T09:00:00.000Z      "1"        "1"        "2"    1.2
2022-04-18T09:00:00.000Z      "2"        "1"        "2"    4.0
2022-04-18T08:00:00.000Z      "1"        "1"        "2"    2.6
2022-04-18T08:00:00.000Z      "2"        "1"        "2"    3.1
2022-04-18T07:00:00.000Z      "1"        "1"        "2"    2.1
2022-04-18T07:00:00.000Z      "2"        "1"        "2"    2.7
Run Code Online (Sandbox Code Playgroud)

我有 1000 行包含时间序列 IOT 数据的行,我正在使用 HighCharts 将这些数据放入图表中。

我的问题是,有没有办法限制我的结果中返回的项目数量,但不是经典的限制。我想始终返回 256 个数据组。因此,如果我有 2,560 行,我的查询将每 100 行按/date trunc / time_bucket 分组,但如果我有 512 行,我的查询将仅每 2 行分组,这样无论如何我总是返回 256。

我当前的查询:

SELECT time_bucket('4 hours', time) as "t"
,locationid, avg(timestamp) as "x", avg(value) as "y"
FROM probe_data
WHERE locationid = '${q.locationid}'and parameterid = '${q.parameterid}' 
and time > '${q.startDate}' and time < `${q.endDate}`
GROUP BY "t", locationid
ORDER BY "t" DESC;
Run Code Online (Sandbox Code Playgroud)

看来我应该能够使用我的最小日期和最大日期来计算可能返回的数量,然后除以 256?这是最好的方法吗?

dav*_*idk 3

您可以通过几种不同的方式来执行类似的操作:

  1. 您只需更改在查询中动态使用的时间段即可time_bucket。您可以对间隔进行算术并获取另一个间隔,即SELECT (now()- '2022-04-21')/256;返回一个间隔,这可以是 的第一个输入time_bucket。所以像
SELECT time_bucket((enddate - startdate) / 256, time) as "t" 
...
GROUP BY time_bucket((enddate - startdate) / 256, time)
Run Code Online (Sandbox Code Playgroud)

应该在很大程度上做你正在寻找的事情......

然而,这确实意味着当您缩小时,您将获得任意更大数据组的平均值,并且不允许您缓存内容或类似内容,并且实际上可能并不是底层过程的良好表示。

另一种选择是:

  1. 您可以在与数据分析相关的设定 time_bucket 处进行平均,然后使用诸如最大三角形三桶之类的算法对其进行下采样,该算法在下采样数据的同时以有用的方式保持图形的视觉准确性。这是我们在 TimescaleDB 中拥有的实验性超级功能之一

这还允许您使用连续聚合之类的方法对一组数据进行下采样time_bucket,然后使用 LTTB 算法更快地获得图形所需的点数。

所以这在某种程度上取决于你正在寻找什么......在某些情况下,单独使用 LTTB 而不进行平均,甚至使用ASAP 平滑(另一种实验性超功能)之类的东西可能是完成你正在寻找的事情的更好方法for 和 是为此类工作内置的!我认为文档页面有更多关于算法及其用途的信息,但 LTTB 和 ASAP 都是专门为图形应用程序设计的,所以我想我应该指出它们!