MySql按最新日期查找记录,并按X列分组

时间:2018-07-23 15:17:39

标签: mysql

我有一个装有电子计数器数据的表,记录每小时到达。由于其详细信息,每个记录都有两个字段MeterUnitidHostTitleMeterUnitid可以具有相同的值,而HostTitle只能是唯一的。

因此,我需要查询返回MeterUnitidHostTitle字段的每个唯一组合的所有最新记录。

目前该表有约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`

因此,现在需要最新的时间并按MeterUnitidHostTitle进行分组。 工作正常,没有重复。 :) 如果有人有更好的解决方案,请分担。谢谢。

0 个答案:

没有答案