【问题标题】:Get last values from joined table in MySQL从 MySQL 中的连接表中获取最后一个值
【发布时间】:2022-12-17 13:10:43
【问题描述】:

对于家庭自动化仪表板,我试图显示不同房间中不同设备的最新值。 我的桌子看起来像这样 表:设备

DeviceID Floor Room Measurement More Information
1 0 WC Room-Temp ...
2 0 WC Desired Room-Temp ...
3 0 WC rel. Humidity ...
... .... ... .... ...
15 1 Kid Room-Temp ...
16 1 Kid Desired Room-Temp ...
17 1 Kid rel. Humidity ...

除此之外,我有一个表“messdaten”(=测量值),我在其中存储收集的数据(DeviceID+Timestamp 是唯一的)。

DeviceID Timestamp Value
3 2022-07-28 13:00:03 63
15 2022-07-28 12:58:37 21.3
17 2022-07-28 12:58:37 60
1 2022-07-28 12:55:00 20.8
... ... ...

我现在想要的是这种形式的表格,我可以在其中找到一个特定房间(这里例如“WC”)的每个设备的所有最新数据。

DeviceID Floor Room Measurement Timestamp Value
1 0 WC Room-Temp 2022-07-28 12:55:00 20.8
2 0 WC Desired Room-Temp 2022-07-28 12:53:00 20.5
3 0 WC rel. Humidity 2022-07-28 13:00:03 63

到目前为止,我最接近的方法是:

SELECT devices.DeviceID, Floor, Room, Measurement, max(messdaten.Timestamp), messdaten.Value 
FROM devices LEFT JOIN messdaten ON messdaten.DeviceID = devices.DeviceID 
WHERE   Room = (SELECT Room FROM devices WHERE DeviceID = 1) 
GROUP BY devices.DeviceID 
ORDER BY `devices`.`Measurement` ASC;

不幸的是,在 Timestamp 中使用“max”仅适用于“Timestamp”列,因此我得到的是最新的时间戳,但不是相应的值。

【问题讨论】:

    标签: mysql home-automation


    【解决方案1】:

    在 MySQL 8+ 上,我们可以在这里使用 ROW_NUMBER()

    WITH cte AS (
        SELECT d.DeviceID, d.Floor, d.Room, d.Measurement, m.Timestamp, m.Value,
               ROW_NUMBER() OVER (PARTITION BY d.DeviceID ORDER BY m.Timestamp DESC) rn
        FROM devices d
        LEFT JOIN messdaten m ON m.DeviceID = d.DeviceID 
        WHERE Room IN (SELECT Room FROM devices WHERE DeviceID = 1) 
    )
    
    SELECT DeviceID, Floor, Room, Measurement, Timestamp, Value
    FROM cte
    WHERE rn = 1
    ORDER BY Measurement;
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2015-05-26
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多