【问题标题】:SELECT most recent measured value for every sensor为每个传感器选择最近的测量值
【发布时间】:2021-07-17 11:59:39
【问题描述】:

我在 MySQL 数据库中有两个表 - SensorsMeasurements 其中 'sensor_id' 是进行测量的传感器的 ID,'value' 是测量值,'measured' 是 Unix 时间(值是什么时候测量)。我想从 Sensors 表中获取每个传感器的最后测量值,因此在此示例中,从 Measurements 表中获取最后 3 行:

id     sensor_id               value       measured
22     1000000000000001        10.20       1619166847821
23     0100000000000001        67.00       1619166847827
24     0000000000000001        3.05        1619166847830

我尝试过类似SELECT MAX(m.id) as id, m.sensor_id, m.value, MAX(m.measured) as measured FROM Measurements m JOIN Sensors s ON m.sensor_id=s.id GROUP BY s.id; 的方法,它适用于“id”和“measured”,但不适用于“value”:

id     sensor_id               value       measured
22     1000000000000001        23.00       1619166847821
23     0100000000000001        47.00       1619166847827
24     0000000000000001        3.03        1619166847830

有什么想法吗?谢谢!

【问题讨论】:

标签: mysql sql database select


【解决方案1】:

我想从传感器表中获取每个传感器的最后测量值

我只会使用相关子查询:

select m.*
from Measurements m
where s.measured = (select max(m2.measured)
                    from Measurements m2
                    where m2.sensor_id = m.sensor_id
                   );

我认为查询不需要sensors

为了提高性能,您需要在Measurements(sensor_id, measured) 上建立索引。

【讨论】:

    【解决方案2】:

    youerquery 失败,因为结果集按照定义是无序的。

    所以用例子

    CREATE TABLE Measurements  (
      `id` INTEGER,
      `sensor_id` vaRCHAr(16),
      `value` FLOAT,
      `measured` varchar(14)
    );
    
    INSERT INTO Measurements 
      (`id`, `sensor_id`, `value`, `measured`)
    VALUES
      ('22', '1000000000000001', '10.20', '1619166847821'),
      ('23', '0100000000000001', '67.00', '1619166847827'),
      ('24', '0000000000000001', '3.05', '1619166847830');
    
    SELECT t1.* 
    FROM Measurements  t1 
    INNER JOIN (SELECT MAX(id) max_id,`sensor_id` FROM Measurements  GROUP BY `sensor_id`) t2
    ON t1.`sensor_id` = t2.`sensor_id` AND t1.id = t2.max_id
    
    编号 | sensor_id |价值 |测量的 -: | :--------------- | ----: | :------------ 22 | 1000000000000001 | 10.2 | 1619166847821 23 | 0100000000000001 | 67 | 1619166847827 24 | 0000000000000001 | 3.05 | 1619166847830

    db小提琴here

    【讨论】:

    【解决方案3】:

    您需要分析或窗口函数。我不确定它们是在哪个版本的 MySQL 中引入的,所以请同时指定您的 MySQL 版本。

    SELECT DISTINCT
    FIRST_VALUE(id) OVER (PARTITION BY sensor_id ORDER BY measured DESC) as id
    ,sensor_id
    ,FIRST_VALUE(value) OVER (PARTITION BY sensor_id ORDER BY measured DESC) as value
    ,FIRST_VALUE(measured ) OVER (PARTITION BY sensor_id ORDER BY measured DESC) as measured 
    FROM Measurements m 
    JOIN Sensors s ON m.sensor_id=s.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      相关资源
      最近更新 更多