我有一个包含数百万条传感器记录的mysql表,其结构如下:
datanumber (auto increment),
stationid (int),
sensortype (int),
measuredate (datetime),
data (medtext)
每个工作站每2-10分钟为每个传感器类型添加一条记录(2-5个传感器)
我只想保持每小时一个记录,每个传感器,每个工作站,这也只有当测量日期超过1年。
我知道如何选择超过一年的数据,但我不知道如何删除行,除了每小时一行。它是每小时保存的第一个值、最后一个值还是随机值,这并不重要。我也不需要计算平均值或其他东西,只需剥离存储的记录量
发布于 2014-10-24 04:31:05
您应该能够执行以下操作
Select * from observations where <old> group by sensortype, stationid, extract(year_month, measure_date), extract(day_hour, measure_date);
group_by
会将每个组中的记录合并为一个。如果需要,您可以将其选择到新表中。
如果您确实需要删除所有冗余的旧记录,只需使用上面的查询选择数据编号,然后删除所有记录NOT IN(<those ids>)
。
发布于 2014-10-24 05:25:40
如果要删除大量行,那么MySQL文档推荐的一种方法是选择要保留到临时表中的行,然后执行原子表重命名。可能是这样的:
INSERT INTO
sensordata_squeezed
SELECT
datanumber,
stationid,
sensortype,
measuredate,
data
FROM
sensordata
WHERE
measuredate < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
GROUP BY
DATE_ADD(DATE(measuredate), INTERVAL HOUR(measuredate) HOUR),
stationid,
sensortype
UNION ALL
SELECT
datanumber,
stationid,
sensortype,
measuredate,
data
FROM
sensordata
WHERE
measuredate >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
;
RENAME TABLE
sensordata TO sensordata_old,
sensordata_squeezed TO sensordata
;
DROP TABLE sensordata_old
;
注意:这取决于MySQL记录的行为,即从既不是分组列也不是组的聚合函数的聚合查询中选择列:它从每个组中选择一个不确定的值。(这是标准SQL的扩展。)我假设在每个组中,所有非聚合列值都将来自同一行;您应该检查这一部分,因为该部分是而不是文档,这种方法依赖于此来维护数据完整性。
这种方法允许您同时避免大型、昂贵的联接和大量的子查询。
请注意,无论您如何执行此操作,您都必须解决如何避免在此操作运行期间丢失数据的问题,因为这可能需要很长时间。
https://stackoverflow.com/questions/26536658
复制相似问题