【发布时间】:2016-09-14 11:12:36
【问题描述】:
我们有一个 Oracle SQL 查询来识别表列的值从一条记录更改为另一条记录的记录。相关列是 (ID, SOME_COLUMN, FROM_DATE, TO_DATE),其中 ID 不是唯一的,并且 FROM_DATE 和 TO_DATE 确定该 ID 的特定行有效的时间间隔,即
(ID1, VAL1, 01/01/2016, 03/01/2016)
(ID1, VAL2, 04/01/2016, 09/01/2016)
(ID1, VAL3, 10/01/2016, 19/01/2016)
等等
我们可以使用以下自连接来实现这一点
SELECT N.ID
O.SOME_COLUMN OLD_VALUE,
N.SOME_COLUMN NEW_VALUE
FROM OUR_TABLE N, OUR_TABLE O
WHERE N.ID = O.ID
AND N.FROM_DATE - 1 = O.TO_DATE
AND N.SOME_COLUMN <> O.SOME_COLUMN
但是,由于该表包含 1 亿条记录,因此它非常符合性能。有没有更有效的方法来做到这一点?有人暗示了分析函数(例如 LAG),但到目前为止我们还没有找到可行的解决方案。任何想法将不胜感激
【问题讨论】:
-
你的问题不清楚。您的日期完全不重叠,并且不清楚您想要什么结果。
-
日期确实不重叠,它们代表时间间隔,在此期间属于该 ID 的特定表行有效。正如您在示例中看到的,一个时间间隔的 FROM_DATE 总是与前一个时间间隔的 TO_DATE 相加 +1。我们需要结果,其中 SOME_COLUMN 的值已从一个间隔更改为另一个。实际上检查您的以下答案,您似乎已经正确解释了所有内容。
标签: sql oracle oracle11g sqlperformance