第一个数据接近一小时mysql

r6vfmomb  于 2023-03-22  发布在  Mysql
关注(0)|答案(1)|浏览(138)

我必须在每天早上接近8点的时候用第一个数据进行查询,但有时8点的数据不在那里,所以我需要下一个数据。
我用这个查询

SELECT datos.id_estacion, datos.fecha, hora, datos.valor 
from datos
where id_estacion=1 
and tipo_sensor=3 
and day(fecha)=1 
and hour(hora) in (8,9)
order by fecha, hora
limit 10

我得到了这些数据

fecha       hors        valor
    2016-01-01  08:45:00    1147,97
    2016-01-01  09:00:00    1147,96
    2016-01-01  09:45:00    1147,96
    2016-02-01  08:00:00    1150,95
    2016-02-01  08:15:00    1150,95
    2016-02-01  08:30:00    1150,95
    2016-02-01  08:45:00    1150,96
    2016-02-01  09:00:00    1150,96
    2016-02-01  09:15:00    1150,96
    2016-02-01  09:30:00    1150,96

但我需要最接近8的

01/01/2016  8:45:00 1147,97
01/02/2016  8:00:00 1150,95

谢谢!

dgsult0t

dgsult0t1#

我想你可以尝试使用MIN(),但你必须将该查询作为派生表,然后使用datos表执行JOIN以获得准确的valor值。这假设在任何MySQL版本中都可以工作:

SELECT a.id_estacion, a.fecha, DATE_FORMAT(hora,'%h:%i:%s'), a.valor
  FROM datos a
  JOIN
(SELECT datos.id_estacion, datos.fecha, MIN(datos.hora) MinHora
  FROM datos
WHERE id_estacion=1 
AND tipo_sensor=3 
AND DAY(fecha)=1
  AND HOUR(hora) >= 8
  GROUP BY datos.id_estacion, datos.fecha) b
ON a.id_estacion=b.id_estacion
  AND a.fecha=b.fecha
  AND a.hora=b.MinHora;

或者你可以尝试使用ROW_NUMBER() ..假设你使用的是具有该功能的MySQL版本(v8+):

WITH cte AS(
SELECT datos.id_estacion, datos.fecha, DATE_FORMAT(hora,'%h:%i:%s') AS hora, 
       datos.valor,
       ROW_NUMBER() OVER (PARTITION BY datos.fecha ORDER BY fecha, hora) Rnum
FROM datos
WHERE id_estacion=1 
AND tipo_sensor=3 
AND DAY(fecha)=1
AND HOUR(hora) >= 8)
SELECT id_estacion, fecha, hora, valor
  FROM cte 
  WHERE Rnum=1;

Demo fiddle

相关问题