Mysql 为每个传感器选择最近的测量值
我在MySQL数据库中有两个表,其中'sensor_id'是进行测量的传感器的id,'value'是测量值,'measured'是测量值的Unix时间。我想从传感器表中获取每个传感器的最后测量值,因此在本例中,测量表的最后3行: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
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
);