3 回答

TA貢獻1816條經驗 獲得超6個贊
這比你想象的更復雜。您不能只查看連續行之間的間隔,您需要跟蹤選定的最后一行以識別下一行。這意味著一個迭代過程;在 SQL 中,這通常使用遞歸查詢來實現 - MySQL 僅支持從 8.0 版本開始。
考慮:
with recursive cte as (
select value, time
from device
where time = (select min(time) from device)
union all
select d.value, d.time
from cte c
inner join device d on d.time = (
select min(d1.time) from device d1 where d1.time >= c.time + interval 10 minute
)
)
select * from cte

TA貢獻1911條經驗 獲得超7個贊
我建議首先使用窗口函數獲?。ㄖ辽伲?0 分鐘后每行的值,然后應用遞歸子查詢:
with recursive d(value, time, next_time) as (
? ? ? select value, time,
? ? ? ? ? ? ?min(time) over (order by time
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?range between interval 10 minute following and unbounded following
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) as next_time
? ? ? from device
? ? ?)
? ? ?recursive cte(value, time, next_time) as (
? ? ? (select value, time, next_time
? ? ? ?from d?
? ? ? ?order by time
? ? ? ?limit 1
? ? ? ) union all
? ? ? select d.value, d.time, d.next_time
? ? ? from cte join
? ? ? ? ? ?d?
? ? ? ? ? ?on device.time = cte.next_time
? ? ? )
select *
from cte;
這是一個 db<>fiddle。

TA貢獻1784條經驗 獲得超9個贊
我認為這會起作用:
$sql="select `value`,`time` from `device` where MINUTE(`time`) IN (0, 10, 20, 30, 40, 50) order by `time`";
如果您有 10 分鐘的多個值并且只需要一個,請使用 group by MINUTE( time
)
- 3 回答
- 0 關注
- 169 瀏覽
添加回答
舉報