我有一个装有电子计数器数据的表,记录每小时到达。由于其详细信息,每个记录都有两个字段MeterUnitid
和HostTitle
。 MeterUnitid
可以具有相同的值,而HostTitle
只能是唯一的。
因此,我需要查询返回MeterUnitid
和HostTitle
字段的每个唯一组合的所有最新记录。
目前该表有约17万条记录,并将在不久的将来增长。 唯一组合只有71个(柜台总数)
那我已经尝试了什么
查询1:
SELECT `MeterUnitid`,`HostTitle`,`Value`,`Timestamp`
FROM ModbusData
WHERE `Timestamp` IN (
SELECT MAX(`Timestamp`)
FROM ModbusData
GROUP BY `MeterUnitid`, `HostTitle`
)
结果:查询工作迅速,但返回一些重复的记录,应该为71但得到88
查询2:
SELECT `MeterUnitid`,`HostTitle`,`Value`,`Timestamp`
FROM ModbusData
WHERE `Timestamp` IN (
SELECT MAX(`Timestamp`)
FROM ModbusData
GROUP BY CONCAT(`MeterUnitid`, `HostTitle`))
GROUP BY `MeterUnitid`,`HostTitle`
结果:与查询1相同,但有重复的记录
查询3:
SELECT * from ModbusData WHERE `Timestamp` = (
select max(`Timestamp`)
from ModbusData b
where a.`MeterUnitid` = b.`MeterUnitid` and a.`HostTitle` = b.`HostTitle`
)
结果:它可以正常工作,但将来查询需要5秒钟才能完成,我认为这将花费更长的时间。
服务器版本:10.1.26-MariaDB-0 + deb9u1-Debian 9.1
任何想法,我如何更新查询1或查询2以获得正确的结果,导致那些查询的工作速度确实比查询3快
答案
经过集思广益并查看其他示例,我发现我的查询不正确/不完整。
我接受了查询第二个查询,并像这样修改了它
SELECT `MeterUnitid`,`HostTitle`,`Value`,`Timestamp`
FROM ModbusData
WHERE (`MeterUnitid`,`HostTitle`,`Timestamp`) IN (
SELECT `MeterUnitid`,`HostTitle`, MAX(`Timestamp`)
FROM ModbusData
GROUP BY CONCAT(`MeterUnitid`, `HostTitle`))
GROUP BY `MeterUnitid`,`HostTitle`
因此,现在需要最新的时间并按MeterUnitid
和HostTitle
进行分组。
工作正常,没有重复。 :)
如果有人有更好的解决方案,请分担。谢谢。