【发布时间】:2023-03-03 14:17:01
【问题描述】:
我目前正在使用自联接来计算任何给定行的下一个最近的时间戳:
SELECT t.COLUMN1,
t.SOME_OTHER_COLUMN,
t.TIMESTAMP_COLUMN,
MAX(pt.TIMESTAMP_COLUMN) AS PREV_TIMESTAMP_COLUMN
FROM Table1 t
LEFT JOIN Table1 pt ON pt.COLUMN1 = t.COLUMN1
AND pt.TIMESTAMP_COLUMN < t.TIMESTAMP_COLUMN
AND pt.SOME_OTHER_COLUMN = SOME_LITERAL_VALUE
GROUP BY t.COLUMN1,
t.SOME_OTHER_COLUMN,
t.TIMESTAMP_COLUMN
问题是,我需要多次这样做,以进行多次比较,这将需要多个嵌套的自连接,这将是非常难看的代码,并且执行起来可能很慢。
您如何使用分析函数来完成同样的事情?
我开始写一些代码,但是看起来不对:
SELECT DISTINCT t.COLUMN1,
t.SOME_OTHER_COLUMN,
t.TIMESTAMP_COLUMN,
MAX(CASE WHEN t.TIMESTAMP_COLUMN < t.TIMESTAMP_COLUMN
AND t.SOME_OTHER_COLUMN = SOME_LITERAL_VALUE
THEN t.TIMESTAMP END) OVER
(PARTITION BY t.COLUMN1) AS PREV_TIMESTAMP_COLUMN1,
MAX(CASE WHEN t.TIMESTAMP_COLUMN < t.TIMESTAMP_COLUMN
AND t.SOME_OTHER_COLUMN = SOME_OTHER_LITERAL_VALUE
THEN t.TIMESTAMP END) OVER
(PARTITION BY t.COLUMN1) AS PREV_TIMESTAMP_COLUMN2
FROM Table1 t
一看到WHEN t.TIMESTAMP_COLUMN < t.TIMESTAMP_COLUMN,我就想“这不可能……”
我知道还有很多其他方法可以使用分析函数,例如ROWS UNBOUNDED PRECEDING,但我是分析函数的新手,我不知道如何实现这些。
使用分析函数完成此任务的最佳方法是什么?
【问题讨论】:
标签: sql oracle oracle-apex window-functions