首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除除每小时一条记录以外的每条记录

如何删除除每小时一条记录以外的每条记录
EN

Stack Overflow用户
提问于 2014-10-24 04:17:58
回答 2查看 947关注 0票数 2

我有一个包含数百万条传感器记录的mysql表,其结构如下:

代码语言:javascript
运行
复制
datanumber (auto increment), 
stationid (int), 
sensortype (int),
measuredate (datetime),
data (medtext)

每个工作站每2-10分钟为每个传感器类型添加一条记录(2-5个传感器)

我只想保持每小时一个记录,每个传感器,每个工作站,这也只有当测量日期超过1年。

我知道如何选择超过一年的数据,但我不知道如何删除行,除了每小时一行。它是每小时保存的第一个值、最后一个值还是随机值,这并不重要。我也不需要计算平均值或其他东西,只需剥离存储的记录量

EN

回答 2

Stack Overflow用户

发布于 2014-10-24 04:31:05

您应该能够执行以下操作

代码语言:javascript
运行
复制
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>)

票数 0
EN

Stack Overflow用户

发布于 2014-10-24 05:25:40

如果要删除大量行,那么MySQL文档推荐的一种方法是选择要保留到临时表中的行,然后执行原子表重命名。可能是这样的:

代码语言:javascript
运行
复制
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的扩展。)我假设在每个组中,所有非聚合列值都将来自同一行;您应该检查这一部分,因为该部分是而不是文档,这种方法依赖于此来维护数据完整性。

这种方法允许您同时避免大型、昂贵的联接和大量的子查询。

请注意,无论您如何执行此操作,您都必须解决如何避免在此操作运行期间丢失数据的问题,因为这可能需要很长时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26536658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档