查询以前的记录 (Oracle)

kai*_*naw 2 oracle

考虑一个 Oracle 数据库,它的每条记录都有一个人、一个日期和一个值。当我提取记录时,我想非常快速和轻松地获得前一个记录,其中人在我获取的记录和前一个记录中都是相同的,并且日期是我获取的记录之前的最大日期。当我问这个时,通常会有很多混乱,所以这里是一个示例数据集:

PERSON,DATE,VALUE
1,2013-12-25,823
2,2013-11-20,384
1,2013-11-10,4837
1,2013-10-01 377
1,2014-01-01,8347
Run Code Online (Sandbox Code Playgroud)

现在,当我获取第一条记录时,我还想获取记录 1,2013-11-10,4837,因为 person 匹配(作为 1,而不是 2),并且前一条记录的日期是之前的最大日期我获取的记录。

我曾尝试使用 connect 子句,但它不能要求“最大日期小于当前记录日期的记录”。我使用的多重连接方法不起作用,因为记录太多 - 完成单个查询需要几个小时。

bil*_*nkc 5

分析功能可助您一臂之力

特别是,超前/滞后将是您的朋友。

SELECT
   LAG(ACTION_DATE) OVER (PARTITION BY PERSON ORDER BY ACTION_DATE ASC)  PREVIOUS_ACTION_DATE
,  LAG(VALUE) OVER (PARTITION BY PERSON ORDER BY ACTION_DATE ASC)  PREVIOUS_VALUE
,  PERSON
,  ACTION_DATE
,  VALUE
FROM
    SomeTabe
Run Code Online (Sandbox Code Playgroud)

SQLFiddle