我有一个包含这些字段的表
EVENT timestamp
SOND int (temperature sond) 1-13
TEMP float (temperature of sond)
EVENT
对于每个sond都不同,因为每个sond的记录仅在更改时插入。
我需要一个查询来显示如下的值
EVENT / SOND / TEMP (last value of previous event)
例如,让我们说我存储了这些行:
15:30 / 1 / 25.50
15:31 / 2 / 31.00
15:35 / 1 / 26.00
我想显示这些结果
15:30 / 1 / 25.50
15:30 / 2 / DEFAULT OR 0
15:31 / 1 / 25.50
15:31 / 2 / 31.00
15:35 / 1 / 26.00
15:35 / 2 / 31.00
由于
SELECT e.EVENT,
s.SONDA,
(SELECT CT1.TEMP
FROM CT_SONDE CT1
WHERE CT1.EVENT<= e.EVENT
AND CT1.SONDA = s.SONDA
ORDER BY CT1.EVENT DESC
LIMIT 1) as TEMPERATURA
from (SELECT CT2.EVENT
from CT_SONDE CT2
GROUP BY CT2.EVENT) e
cross join (SELECT CT3.SONDA
FROM CT_SONDE CT3
GROUP BY CT3.SONDA) AS s
ORDER BY e.EVENT, s.SONDA
答案 0 :(得分:0)
这是一个查询:
select e.event,
s.sonda,
(select temp
from ct_sonde
where event <= e.event
and sonda = s.sonda
order by event desc
limit 1) as temp
from (select event
from ct_sonde
group by event) e
cross join (select sonda
from ct_sonde
group by sonda) s
order by e.event, s.sonda
limit 1
是非标准SQL,但在MySql中可以找到最新的前导,用于对某个 sonda 值没有明确温度的事件。< / p>
仍然相关的子查询可能是性能的杀手。因此,下一个解决方案可能会有更好的性能:
在MySql查询中使用变量可能存在风险,因为必须对引擎处理查询的不同部分并确定(中间)顺序的顺序进行一些假设:
select event, sonda, temp
from (
select case when temp is null and @sonda = sonda
then @temp
else @temp := temp
end as temp,
@sonda := sonda as sonda,
event
from (
select log.temp,
s.sonda,
e.event
from (select sonda
from ct_sonde
group by sonda) s
cross join (select event
from ct_sonde
group by event) e
left join ct_sonde log
on log.event = e.event
and log.sonda = s.sonda
order by s.sonda, e.event
limit 50000000
) as phase1
) as phase2
order by event, sonda
limit 50000000
是使引擎服从内部order by
子句的额外预防措施。该数字必须至少是没有该条款将返回的记录数;它不应该真正消除结果中的记录。关于&#34; phase1&#34;的查询取决于此顺序,因为它使用变量来跟踪当前 sonda 和 sonda 的最新 temp 。
最后,外部查询通过事件然后通过 sonda 重新排序结果(如果需要)。同样,没有绝对保证这总是有效,因为SQL引擎可以自由地重新排序中间结果集并以任何顺序评估变量。