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

Java sql选择事件,包括范围开始时间之前的第一条记录,java,sql,Java,Sql,我需要在有开始时间和结束时间的条形图中绘制事件 表结构: id:工作站的id 变量id:事件类型过去,预测 事件时间:时间戳 值:事件状态随附的值 我需要的是事件时间介于chartStartTime和chartEndTime之间的事件,以及chartStartTime之前的第一个事件,无论该事件发生在何时 如何在一个选择中组合此标准? 不要忘记性能,因为表可以容纳数百万条记录 我现在尝试的是在开始时间之前首先选择事件: SELECT event_time, value FROM table

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

表结构: id:工作站的id 变量id:事件类型过去,预测 事件时间:时间戳 值:事件状态随附的值

我需要的是事件时间介于chartStartTime和chartEndTime之间的事件,以及chartStartTime之前的第一个事件,无论该事件发生在何时

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

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

SELECT event_time, value FROM table   
WHERE id = xy AND event_time < startTime ORDER BY event_time desc LIMIT 1
我的实际查询:

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万条记录的测试表:

您可以使用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的更多信息

union的性能如何,正如我在某个地方读到的那样,每次选择它都会扫描表两次?我会尝试你的两个建议,看看它是如何运作的。工会有绩效问题。使用相关查询检查第二个解决方案。它在这里提供了更好的性能检查[corrolated performance Well这对我很有用,但我确实有一个性能问题。由于数十亿条记录,查询表大约需要8分钟,这是不可接受的!因此我需要一种更好更快的方法来获得结果,有什么想法吗?在event_time列上创建索引,并将其用于选择操作。在此处创建索引检查[创建。并在此处使用索引进行选择检查[使用索引。事件时间上已存在索引..有关表和索引定义以及执行计划,请参阅问题编辑
(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)