1

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

我有一个包含日期的日期列(称为日期)

2011-01-13  

另一列包含时间,以小时、分钟、秒、毫秒为单位。(称为时间)

01:11:43.381

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

我怎样才能做到这一点 ?虽然我搜索了一下,但我在网上找不到任何东西:(

非常感谢 !

4

3 回答 3

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;

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

于 2014-12-01T15:27:14.553 回答
1

您应该能够删除除第一行之外的每一行,满足您使用下面的简单删除语句声明的条件。

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)

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

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

于 2014-12-01T17:42:29.777 回答
0

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

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

添加一个名为epoch_minutetype的列INT,给它一个UNIQUE索引约束,并用该值的等效值填充它。然后,您可以使用INSERT IGNOREINSERT ... ON DUPLICATE KEY类型触发器来处理每分钟的重复次数。这取决于您是要保留每分钟的第一条记录还是最后一条记录。

您可以使用以下UNIX_TIMESTAMP()函数迁移旧值:

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;

最后,交换表:

RENAME TABLE table_name TO table_name_old, _table_name to table_name;
于 2014-12-01T15:09:39.067 回答