首页 > 解决方案 > 向使用 LAG 函数的 SELECT 语句的结果添加行的最佳方法

问题描述

我有一个带有时间戳的表,我需要从中选择所有时间戳间隔,创建一个带有时隙的结果表。该结果还必须具有“过去 - 最旧条目”和“最新条目 - 未来”的倍数。

我对这个问题的解决方案是使用 LAG,然后使用另一个 SELECT 添加最后一行(未来行)。这是实际问题的简化:

WITH dummy_values as (
    (select to_date('2019-08-10') some_timestamp from dual
     union
     select to_date('2019-08-12') some_timestamp from dual
     union
     select to_date('2019-08-14') some_timestamp from dual
     union
     select to_date('2019-08-16') some_timestamp from dual)
)
SELECT 
    nvl(lag(some_timestamp, 1) over (order by some_timestamp), to_date('1000-01-01')) before,
    some_timestamp after
FROM 
    dummy_values
UNION
    SELECT
        some_timestamp    before,
        to_date('9999-12-31') after
    FROM (  SELECT      *
            FROM        dummy_values
            ORDER BY    some_timestamp DESC)
    WHERE ROWNUM = 1
;

我很想知道是否有更好的方法来实现这一点,即无需对表执行第二次 SELECT 以获取最新值。

我不能将实际的未来和过去的值插入表中。

标签: plsqlwindow-functions

解决方案


在“WITH”子句中,为未来日期添加一个联合。

WITH dummy_values as ( (select to_date('2019-08-10') some_timestamp from dual union select to_date('2019-08-12') some_timestamp from dual union select to_date('2019-08-14') some_timestamp from dual union select to_date('2019-08-16') some_timestamp from dual union select to_date('9999-12-31') some_timestamp from dual) ) SELECT nvl(lag(some_timestamp, 1) over (order by some_timestamp), to_date('1000-01-01')) before, some_timestamp after FROM dummy_values

lag您可以在执行功能之前合并未来的日期。


推荐阅读