【问题标题】:Select last distinct records where table1.column1 = table2.column2选择最后一个不同的记录,其中 table1.column1 = table2.column2
【发布时间】:2016-01-20 17:52:33
【问题描述】:

我有两个来自同一个数据库的表:

表格读数:

表传感器:

我正在尝试创建一个查询,该查询将返回,对于在 SENSORS 中注册的每个传感器,它是在 READINGS 中注册的最后一行。请注意,同一个传感器在 READINGS 中可以有多个寄存器,但在 SENSORS 中只有一个。

结果应该是这样的:

数据库转储:https://dl.dropboxusercontent.com/u/85576999/redeSensores.sql

【问题讨论】:

    标签: mysql


    【解决方案1】:

    http://sqlfiddle.com/#!9/95818/5

    SELECT readings.*
    FROM readings
    INNER JOIN sensors
    ON sensors.idSensor = readings.sensorid
    LEFT JOIN readings r
    ON r.sensorid = readings.sensorid
      AND r.`datetime` > readings.`datetime`
    WHERE r.id IS NULL
    

    或者如果您需要两个表中的信息:

    http://sqlfiddle.com/#!9/95818/6

    SELECT readings.*, 
           sensors.*
    FROM readings
    INNER JOIN sensors
    ON sensors.idSensor = readings.sensorid
    LEFT JOIN readings r
    ON r.sensorid = readings.sensorid
      AND r.`datetime` > readings.`datetime`
    WHERE r.id IS NULL
    

    更新最后一天的平均值

    http://sqlfiddle.com/#!9/95818/10

    SELECT t.*, 
       AVG(r_avg.temperature),
       AVG(r_avg.pollution),
       AVG(r_avg.noise),
       AVG(r_avg.humidity)
    FROM (SELECT readings.*, sensors.*
    FROM readings
    INNER JOIN sensors
    ON sensors.idSensor = readings.sensorid
    LEFT JOIN readings r
    ON r.sensorid = readings.sensorid
      AND r.`datetime` > readings.`datetime`
    WHERE r.id IS NULL 
    ) t
    LEFT JOIN readings r_avg
    ON t.sensorid = r_avg.sensorid
      AND r_avg.`datetime` >= DATE_ADD(t.datetime,INTERVAL -1 DAY)
    GROUP BY t.id;
    

    UPDATE 2要过滤聚合记录,您可以使用HAVING

    http://sqlfiddle.com/#!9/95818/11

    HAVING AVG(r_avg.temperature)!=42
    

    【讨论】:

    • 完美运行。非常感谢!是否也可以获得每个传感器的平均读数?
    • 一天的平均值?一个小时?哪个平均值?
    • 最后一天会很好。我想知道查询会怎样。
    • 检查更新。顺便说一句,我的原始查询有一个错误,您应该将< 更改为> 以获取最后一条记录。我不知道你是怎么检查的 :-) 但是做这个 AVG 调试我发现我的查询确实只得到了第一条记录而不是最后一条记录 :-)
    • 太感谢了 =D 非常感谢。最后一件事:查询是否可以只返回不满足子句的行?就像在您发布的第一个和最后一个查询中插入 where temperature is not -99 一样。这样,如果传感器的注册温度为 -99,则查询将不会返回该行。
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多