Oracle查询 - 没有游标

时间:2014-05-12 13:57:25

标签: sql oracle select

我遇到了这个问题。我有来自传感器的数据样本/记录表:

sensor | datetime       | value
----------------------------------
A      | 20140512 12:00 | 100
A      | 20140512 12:02 | 102
A      | 20140512 12:04 | 104
B      | 20140512 12:00 | 200
B      | 20140512 12:02 | 203
B      | 20140512 12:04 | 206
C      | 20140512 12:00 | 300
C      | 20140512 12:02 | 304
C      | 20140512 12:04 | 308

我需要在给定时间(由变量指定)中获取值和前值(或者增加/减少),如下所示(时间12:02):

sensor | value | previous value
--------------------------------
A      | 102   | 100
B      | 203   | 200
C      | 304   | 300

有人可以帮助我吗?

注意:我不想使用临时游标和teporary表。

谢谢,帕维尔

2 个答案:

答案 0 :(得分:1)

您应该为此使用分析函数,尤其是lag()

select t.sensor, t.value, t.prev_value
from (select t.*,
             lag(value) over (partition by sensor order by datetime) as prev_value
      from table t
     ) t
where datetime = :DATETIME;

答案 1 :(得分:0)

真正通用(ANSI-SQL)查询可以如下。

SELECT
  this.*,
  prev.*
FROM
  yourTable  AS this
INNER JOIN
  yourTable  AS prev
    ON  prev.sensor   = this.sensor
    AND prev.datetime = (SELECT MAX(lookup.datetime)
                           FROM yourTable  AS lookup
                          WHERE lookup.sensor   = this.sensor
                            AND lookup.datetime < this.datetime
                        )

其他替代方案取决于您所使用的Oracle版本。