SQL查询图表同一个表

时间:2016-04-30 18:54:49

标签: mysql sql

我有一个包含这些字段的表

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   

1 个答案:

答案 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引擎可以自由地重新排序中间结果集并以任何顺序评估变量。