plsql - 向使用 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 以获取最新值。
我不能将实际的未来和过去的值插入表中。
解决方案
在“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
您可以在执行功能之前合并未来的日期。
推荐阅读
- xcode - 归档时 SPM Kingfisher SwiftUI 编译器错误
- vim-plugin - Neovim gkeep 插件
- sql-server - SQL Server:性能问题:WHERE 子句中的 OR 语句替换
- mysql - 为什么 MYSQL 数据目录更改失败,sql 在默认位置创建自己的实例
- mingw - 使用 Bazel 和 Mingw 编译 gflags 库
- java - 如何在 PL/SQL 中的 Map 中返回结果?
- python - 输出 ==> elif mid_number
cards= [20,19,18,17,16,15,13, 11, 10, 7, 4, 3, 1, 0], query=1 def checker(cards,query
- sas - 在 Sas Miner 中修改变量
- c++ - 如何在另一个 Qt 线程上运行它?
- reactjs - Ref 动态反应