我在MySQL中有一个非常大的表,其中包含时间戳为几毫秒的行。
我有一个日期列,其中包含日期(称为日期)
2011-01-13
和另一列包含时间,小时,分钟,秒,毫秒......(称为时间)
01:11:43.381
由于每分钟记录太多,我是否可以每分钟保留一个条目并在同一分钟内删除其他条目? (例如,我可以保留每分钟的第一个条目)
我该怎么做?虽然我搜索了一下,但我无法在网上找到任何东西:(
非常感谢!
答案 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
索引约束,并使用该值的等效值填充它。然后,您可以使用UNIQUE
或INSERT 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之外的所有内容。
重要说明:多次插入不需要的记录将是解决此问题的最佳方法,但提出问题的人不是他的选择。