删除所有行按 strftime 每小时只保留一行

delete all rows keep only one per hour group by strftime

我有一个 Home Assistant sqlite 文件。

我的问题是它长得很快并且达到了巨大的尺寸。 所以我制作了一个 php 脚本,每 24 小时清理一次。 我删除旧的和不相关的数据,只留下我需要的数据。

此外,我想优化我为每个传感器留下的数据,每小时删除一个值以外的所有数据,它将为我提供所有图表所需的信息并减小文件大小。

我正在考虑使用 not in 选项并编写了以下命令:

 DELETE from states where state_id not in (select state_id, strftime ('% Y-% m-% d% H', last_changed, 'localtime') as date_hour from states group by entity_id, date_hour);

我按传感器 ID 以及时间和日期对所有传感器进行排序,并每小时删除一个除外的所有传感器。

但是当我 运行 命令时,我得到了: Error: only a single result allowed for a SELECT that is part of an expression

因为我无法删除 date_hour 列,你们认为我应该怎么做? 谢谢!

子查询 returns 2 列,因此您必须将 2 列与其结果进行比较:

DELETE FROM states 
WHERE (entity_id, last_changed) NOT IN (
  SELECT entity_id, MAX(last_changed)
  FROM states 
  GROUP BY entity_id, strftime('%Y-%m-%d% %H', last_changed) 
); 

参见demo