如果我们可以使用row_number over( ... ),这将是一个简单的问题,但 MySQL 的解决方案并不难。对于这样的问题,看看我们是否可以查询我们想要删除的行的列表。这听起来很容易。首先,我们想要列出每天的每个小时以及该小时的第一个(最少)条目:
select Date( MeasureDate ) TheDate, Hour( MeasureDate ) TheHour, Min( MeasureDate ) MinTime
from T
group by TheDate, TheHour;
所以我们只需要将表连接回这个结果集:
select T.*
from T
join(
select Date( MeasureDate ) TheDate, Hour( MeasureDate ) TheHour, Min( MeasureDate ) MinTime
from T
group by TheDate, TheHour
) as T1
on T1.MinTime = T.MeasureDate
这为我们提供了我们想要保留的所有行。所以使用left join 来反转结果:
select T.*
from T
left join(
select Date( MeasureDate ) TheDate, Hour( MeasureDate ) TheHour, Min( MeasureDate ) MinTime
from T
group by TheDate, TheHour
) as T1
on T1.MinTime = T.MeasureDate
where T1.MinTime is null;
将select 更改为delete et viola:
delete TDel
from T TDel
left join(
select Date( MeasureDate ) TheDate, Hour( MeasureDate ) TheHour, Min( MeasureDate ) MinTime
from T
group by TheDate, TheHour
) as T1
on T1.MinTime = TDel.MeasureDate
where T1.MinTime is null;
您可以酌情添加其他字段,例如SensorType,以保留每个传感器每小时的第一次输入,或者您想要调整它。 SqlFiddle