【问题标题】:How to use analytic functions to find the next-most-recent timestamp in the same table如何使用分析函数在同一个表中查找下一个最近的时间戳
【发布时间】: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 &lt; t.TIMESTAMP_COLUMN,我就想“这不可能……”

我知道还有很多其他方法可以使用分析函数,例如ROWS UNBOUNDED PRECEDING,但我是分析函数的新手,我不知道如何实现这些。

使用分析函数完成此任务的最佳方法是什么?

【问题讨论】:

    标签: sql oracle oracle-apex window-functions


    【解决方案1】:

    我认为您可以使用框架规范来设置条件窗口最大值,如下所示:

    SELECT DISTINCT
        COLUMN1,
        SOME_OTHER_COLUMN,
        TIMESTAMP_COLUMN,
        MAX(CASE WHEN SOME_OTHER_COLUMN = 'SOME_LITERAL_VALUE' THEN TIMESTAMP_COLUMN END) 
            OVER(
                PARTITION BY COLUMN1 
                ORDER BY TIMESTAMP_COLUMN
                ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
            ) PREV_TIMESTAMP_COLUMN
    FROM Table1 t
    

    这将为您提供具有相同COLUMN1 且其SOME_OTHER_COLUMN 等于所需文字值的先前记录中的最大时间戳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多