Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为每个传感器选择最近的测量值_Mysql_Sql_Database_Select - Fatal编程技术网

Mysql 为每个传感器选择最近的测量值

Mysql 为每个传感器选择最近的测量值,mysql,sql,database,select,Mysql,Sql,Database,Select,我在MySQL数据库中有两个表,其中'sensor_id'是进行测量的传感器的id,'value'是测量值,'measured'是测量值的Unix时间。我想从传感器表中获取每个传感器的最后测量值,因此在本例中,测量表的最后3行: id sensor_id value measured 22 1000000000000001 10.20 1619166847821 23 0100000000000001

我在MySQL数据库中有两个表,其中'sensor_id'是进行测量的传感器的id,'value'是测量值,'measured'是测量值的Unix时间。我想从传感器表中获取每个传感器的最后测量值,因此在本例中,测量表的最后3行:

id     sensor_id               value       measured
22     1000000000000001        10.20       1619166847821
23     0100000000000001        67.00       1619166847827
24     0000000000000001        3.05        1619166847830
我尝试了一些方法,比如选择MAXm.id作为id,m.sensor\u id,m.value,MAXm.measured作为测量值,m在m.sensor\u id=s.id上加入传感器s,按s.id分组;这适用于“id”和“测量”的罚款,但不适用于“值”:

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

有什么想法吗?谢谢

您需要的是分析或窗口功能。我不确定他们介绍的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

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

所以,举个例子

小提琴

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

我将只使用一个相关子查询:

select m.*
from Measurements m
where s.measured = (select max(m2.measured)
                    from Measurements m2
                    where m2.sensor_id = m.sensor_id
                   );
我认为查询不需要传感器


对于性能,您需要测量传感器id的索引,测量。

您可以使用窗口功能。或者您可以在子查询中获取每个传感器id的最大测量值,并从表的另一个副本中检索相应的行。这是否回答了您的问题?好极了
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
id | sensor_id | value | measured -: | :--------------- | ----: | :------------ 22 | 1000000000000001 | 10.2 | 1619166847821 23 | 0100000000000001 | 67 | 1619166847827 24 | 0000000000000001 | 3.05 | 1619166847830
select m.*
from Measurements m
where s.measured = (select max(m2.measured)
                    from Measurements m2
                    where m2.sensor_id = m.sensor_id
                   );