我遇到了这个问题。我有来自传感器的数据样本/记录表:
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表。
谢谢,帕维尔
答案 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版本。