sql选择事件,包括范围开始时间之前的第一条记录

时间:2017-01-18 10:50:04

标签: java sql

我需要在条形图中绘制具有开始时间和结束时间的事件。

表结构:
id:工作站的id var_id:事件类型(过去,预测)
event_time:时间戳
value:事件(状态)附带的值

我需要的是chartStartTime和chartEndTime之间的event_time事件以及chartStartTime之前的第一个事件,当这个event_time是时,dosn无关紧要。

如何在一个SELECT中组合这个标准?
不要忘记性能,因为该表可以容纳数百万条记录!

我现在尝试的是首先在开始时间之前选择事件:

SELECT event_time, value FROM table   
WHERE id = xy AND event_time < startTime ORDER BY event_time desc LIMIT 1

然后:

SELECT event_time, value FROM table
WHERE id = xy AND (var_id = past OR var_id = forecast)
AND event_time >= startTime AND event_time < endTime
ORDER BY event_time ASC

此查询位于while循环中,该循环是找到的工作站的结果集。 xy是工作站的id。

这给了我很多时间,因为我在sql中没有那么多的经验 我很感激你的帮助

表定义:

CREATE TABLE a_value( 
id          INTEGER     DEFAULT '0',
var_id      INTEGER     DEFAULT '0',
event_time  INTEGER     DEFAULT '0',
value       FLOAT       DEFAULT '0',
PrimKeya_value
PrimKey2(id,var_id,event_time)
)
INDEX-DEFINITION:
CREATE INDEX aValueTimeFirst ON a_value (event_time)

我的实际查询:

select event_time, value_f from a_value use index (aValueTimeFirst)
where id = 5866 and var_id in (-350, -351)
and event_time >= (
  select event_time from a_value where id = 5866 and event_time < 1484552880
  order by event_time desc limit 1
) order by event_time asc

执行计划:对于包含1100万条记录的测试表: Execution plan: for test table with 11 million records

1 个答案:

答案 0 :(得分:0)

您可以使用union来组合这两个查询结果:

(SELECT event_time, value FROM table   
WHERE id = xy AND event_time < startTime ORDER BY event_time desc LIMIT 1)
union
(SELECT event_time, value FROM table
WHERE id = xy AND (var_id = past OR var_id = forecast)
AND event_time >= startTime AND event_time < endTime
ORDER BY event_time ASC)

你也可以用这个得到结果:

(SELECT event_time, value FROM table
WHERE id = xy AND (var_id = past OR var_id = forecast)
AND event_time >= (SELECT event_time FROM table   
WHERE id = xy AND event_time < startTime ORDER BY event_time desc LIMIT 1)
AND event_time < endTime
ORDER BY event_time ASC)

点击此处union

查看更多关于工会的信息