我在 MySQL 中有一个非常大的表,其中包含时间戳长达毫秒的行。
我有一个包含日期的日期列(称为日期)
2011-01-13
另一列包含时间,以小时、分钟、秒、毫秒为单位。(称为时间)
01:11:43.381
由于我每分钟的记录太多,是否可以每分钟保留一个条目并在同一分钟内删除其他条目?(例如,我可以每分钟保留第一个条目)
我怎样才能做到这一点 ?虽然我搜索了一下,但我在网上找不到任何东西:(
非常感谢 !
你可以做你想做的事情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;
我不向你保证这是有效的,但它应该做你想做的事。
您应该能够删除除第一行之外的每一行,满足您使用下面的简单删除语句声明的条件。
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 之外的所有内容。
重要提示:不多次插入不需要的记录将是解决此问题的最佳方法,但提出问题的人已经提到这不是他的选择。
将您的日期和时间分成两列可能会非常烦人,因此除非您有令人信服的技术原因,否则我会避免这样做。
至于你的小问题,你需要的是一个可以强制UNIQUE
约束的列。最简单的方法是使用分钟序列,或以秒为单位的纪元时间除以 60。
添加一个名为epoch_minute
type的列INT
,给它一个UNIQUE
索引约束,并用该值的等效值填充它。然后,您可以使用INSERT IGNORE
或INSERT ... 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;