如何 select 固定在一个时间范围内均匀分布的数据点数量

How to select fix number of datapoints spread evenly over a time range

我很难创建一个 SQLite 命令,如果数据点的数量超过 50 个,该命令将 return 基于时间均匀分布的数据点。

基本上,我每 30 秒存储一次数据。但是,如果我想查看最后一个小时的数据,那将是一个非常大的数据量,并且最终会冻结我的 RPI,因为它试图可视化这些数据。因此,我的解决方案是创建一个 SQLite 命令,将 return 数据点的数量限制为 50 个,并在一个时间范围内均匀分布。

如果我想要最后一分钟、5 分钟、10 分钟等,我有单独的命令。一旦超过 1 小时,我需要限制数据,以便我可以将其硬编码到命令中(不需要IF 语句)

这是我目前尝试的无效命令:

select Voltage from Battery2 where Timestamp >= Datetime('now', '-1 hour') % (SELECT COUNT(*)/50 FROM Battery2)=0;

这是基于这个堆栈溢出post:

编辑:

以下是函数输出的一些示例数据:

Voltage: 54
Timestamp: "2022-01-13 16:47:47"

Voltage: 54
Timestamp: "2022-01-13 16:48:18"

Voltage: 54
Timestamp: "2022-01-13 16:48:49"

您可以使用 NTILE() window 函数根据列 Timestamp 将结果集分成 50 组,然后使用聚合从每个组中选择 1 行 MAX()MIN() 聚合函数:

WITH cte AS (
  SELECT *, NTILE(50) OVER (ORDER BY Timestamp) nt 
  FROM Battery2 
  WHERE Timestamp >= datetime('now', '-1 hour')
)
SELECT MAX(Timestamp) AS Timestamp, Voltage
FROM cte
GROUP BY nt;