MySQL - 每分钟保持一行

时间:2014-12-01 14:56:25

标签: mysql time row minute

我在MySQL中有一个非常大的表,其中包含时间戳为几毫秒的行。

我有一个日期列,其中包含日期(称为日期)

2011-01-13  

和另一列包含时间,小时,分钟,秒,毫秒......(称为时间)

01:11:43.381

由于每分钟记录太多,我是否可以每分钟保留一个条目并在同一分钟内删除其他条目? (例如,我可以保留每分钟的第一个条目)

我该怎么做?虽然我搜索了一下,但我无法在网上找到任何东西:(

非常感谢!

3 个答案:

答案 0 :(得分:1)

您可以使用delete和聚合:

执行您想要的操作
delete bt
    from bigtable bt join
         (select date, min(time) as time
          from bigtable
          group by date, hour(time), minute(time)
         ) btt
         on btt.date = bt.date and
            hour(bt.time) = hour(btt.time) and
            minute(bt.time) = minute(btt.time) and
            bt.time <> btt.mintime;

我并不向你保证这是有效的,但它应该做你想要的。

答案 1 :(得分:0)

将您的日期和时间分成两列可能会非常烦人,所以除非您有令人信服的技术原因,否则我会避免这样做。

至于您的分钟问题,您需要的是一个可以强制执行UNIQUE约束的列。最简单的方法是使用分钟序列,或以秒为单位的纪元时间除以60.

添加名为epoch_minute的{​​{1}}类型的列,为其指定INT索引约束,并使用该值的等效值填充它。然后,您可以使用UNIQUEINSERT IGNORE类型触发器来处理每分钟的重复次数。这取决于您是想保留第一条记录还是每分钟的最后一条记录。

您可以使用UNIX_TIMESTAMP()功能迁移旧值:

INSERT ... ON DUPLICATE KEY

例如,给定一个名为UPDATE table_name SET epoch_minute = UNIX_TIMESTAMP(date_column) / 60 的表,准备一个新表来接收具有唯一列约束的值:

table_name

然后您可以使用CREATE TABLE _table_name LIKE table_name; ALTER TABLE _table_name ADD COLUMN epoch_minute INT; CREATE UNIQUE INDEX index_table_name_epoch_minute ON _table_name (epoch_minute); 跳过重复项:

INSERT IGNORE

最后,交换表:

INSERT IGNORE INTO _table_name (column_a, column_b, epoch_minute)
  SELECT column_a, column_b, UNIX_TIMESTAMP(date_column) / 60
    FROM table_name;

答案 2 :(得分:0)

您应该能够删除除第一个之外的所有行,并使用下面的简单删除语句符合您声明的条件。

DELETE FROM TABLE1 WHERE ID NOT IN (
        SELECT I FROM (
               SELECT  MIN(PRIMARY_KEY) I, 
                       CONCAT( DATE_FIELD ,' ', SUBSTR(TIME_FIELD, 1, 5)) DT  
               FROM TABLE1 GROUP BY DT) AS X)

基本上我正在尝试连接日期和&#34;时间直到分钟&#34;并过滤内部查询中的最小标识符,然后删除除所选最小ID之外的所有内容。

重要说明:多次插入不需要的记录将是解决此问题的最佳方法,但提出问题的人不是他的选择。