如何 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;
我很难创建一个 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;