【发布时间】:2015-01-13 01:36:48
【问题描述】:
我有一个存储简单日志数据的表:
CREATE TABLE chronicle (
id INT auto_increment PRIMARY KEY,
data1 VARCHAR(256),
data2 VARCHAR(256),
time DATETIME
);
该表已接近 100 万条记录,因此我想开始合并数据。
我希望能够每天获取每个DISTINCT(data1, data2) 的第一条和最后一条记录,并删除所有其余的。
我知道如何只提取数据并以我想要的任何语言对其进行处理,然后删除带有巨大 IN (...) query 的记录,但直接使用 SQL 似乎是一个更好的选择(我错了吗?)
我尝试了几个查询,但除了 JOIN 之外,我对 SQL 不太擅长。
这是我目前所拥有的:
SELECT id, Max(time), Min(time)
FROM (SELECT id, data1 ,data2, time, Cast(time AS DATE) AS day
FROM chronicle) AS initial
GROUP BY day;
这让我得到了每天的第一次和最后一次,但它并没有被数据分开(即我得到每天的最后一条记录,而不是每天每组不同数据的最后一条记录。)另外,id 仅用于 Min(time)。
我在这个特定问题上找到的信息仅用于查找当天的最后一条记录,而不是数据集的每条最后一条记录。
重要提示:我想要每个 DISTINCT(data1, data2) 每天的第一条/最后一条记录,而不仅仅是表格中每天的第一条/最后一条记录。每天将有超过 2 条记录。
解决方案: 感谢 Jonathan Dahan 和 Gordon Linoff 我的解决方案:
SELECT o.data1, o.data2, o.time FROM chronicle AS o JOIN (
SELECT Min(id) as id FROM chronicle GROUP BY DATE(time), data1, data2
UNION SELECT Max(id) as id FROM test_chronicle GROUP BY DATE(time), data1. data2
) AS n ON o.id = n.id;
从这里开始,只需引用同一个表即可删除行。
【问题讨论】:
-
可以依赖 id 作为顺序吗?意思是 id 10 的日期/时间总是等于或早于 id 11?
-
您想删除旧记录的原因是什么?是否与查询性能不佳有关?还是磁盘空间使用情况?
-
@JonathanDahan 他们肯定不会是连续的,因为正在删除记录。但我认为你实际上的意思是单调递增。据我所知,如果 id_a ,mysql 的
auto_increment默认情况下是单调递增的。 -
@JonathanDahan 两者。有很多重复记录。
-
好吧,为了性能,你可以简单地添加一个索引来解决问题。对于空间,是的,您需要删除记录。
标签: mysql sql greatest-n-per-group