检索当前和最近的先前值(Oracle)

K2J*_*K2J 2 sql oracle

我正面临一个问题,我花了很多时间试图解决,虽然我有一个解决方案,它很笨重,并且涉及pl/sql处理,我想知道别人可能会想出什么.

我正在使用一个数据集,每次更改记录时都会创建一个新行,从而保留历史记录.然后,在我们的应用程序中显示最新版本.考虑一个包含以下数据的表:

Person ID  Last_Name  Address_line1       Effective_Start_Date  Effective_End_Date
4913       Jones      1 First Street      03-aug-02             31-dec-12
4913       Cross      1 First Street      01-feb-02             02-aug-02
4913       Cross      86 Green Avenue     01-mar-01             31-jan-02
4913       Cross      87 Devonshire Road  01-jan-90             28-feb-02

作为报告的一部分,我需要提取在给定日期集之间发生变化的细节.例如,假设我想提取当前address_line1和前一个address_line1以及更改日期(effective_start_date添加新地址时).需要注意的是,如果其他列数据发生变化,这也将创建一个新行.例如,在上面的示例中,last_name地址更改后更改.

不幸的是,查询必须是通用的,以便它可以作为报告的一部分运行,即不必明确指定有效的开始和结束日期.

希望一切都有道理.希望你们还和我在一起.因此,根据上面的数据集,我希望在我的报告中看到以下结果:

Person ID  Surname  Address_line1   Prev_Address_line1  Effective Start date of New Address Line 1
4913       Jones    1 First Street  86 Green Avenue     01-feb-02

我的方法涉及使用pl/sql进行处理并在相当多的记录上循环,但我想知道是否可以在单个sql查询中完成.

有没有人对是否只使用sql可以做到这一点有任何想法?

Qua*_*noi 5

SELECT  personID, surname, address_line1,
        LAG(address_line1) OVER (PARTITION BY personID ORDER BY effectiveDate) AS prev_address_line1
FROM    mytable
WHERE   personID = :myid
ORDER BY
        effectiveDate
Run Code Online (Sandbox Code Playgroud)

要返回最后一个有效值,请使用:

SELECT  *
FROM    (
        SELECT  personID, surname, address_line1,
                LAG(address_line1) OVER (PARTITION BY personID ORDER BY effectiveDate) AS prev_address_line1,
                ROW_NUMBER() OVER (PARTITION BY personID ORDER BY effectiveDate DESC) AS rn,
        FROM    mytable
        WHERE   personID = :myid
        )
WHERE   rn = 1
Run Code Online (Sandbox Code Playgroud)