我正面临一个问题,我花了很多时间试图解决,虽然我有一个解决方案,它很笨重,并且涉及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可以做到这一点有任何想法?
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)
| 归档时间: |
|
| 查看次数: |
16205 次 |
| 最近记录: |