如何获取动态范围内的下一个值?

问题描述 投票:0回答:1

我希望获得动态范围内的下一个值。在 X 点之前存在的所有值(由 TimeDate 列确定)之间,我想获取下一个最大的 ValueDate(如果存在)。查找可能类似于无界前行和当前行,并且很可能按 TimeDate 排序,但我还没有弄清楚如何使用 LAG/LEAD 或 FIRST/LAST VALUE 来执行此操作。

这是数据的样子以及我想要实现的目标:

一些索引 价值日期 时间日期 期望的结果
1 2022年2月13日 2023年9月10日
1 2022年3月21日 2023年9月11日
1 2022 年 1 月 17 日 2023年9月12日 2022年2月13日
1 2022年2月28日 2023年9月13日 2022年3月21日
1 2021年12月19日 2023年9月14日 2022 年 1 月 17 日
1 2021年12月23日 2023年9月15日 2022 年 1 月 17 日

重要说明 - 尽管 ValueDate = '23.12.2021'ValueDate = '19.12.2021' 之后的下一个最大值,但根据 TimeDate 列,它还不“存在”。

这里有一些快速生成数据的 SQL:

CREATE VOLATILE TABLE TempTable (
    SomeIndex INTEGER,
    ValueDate DATE FORMAT 'YYYY-MM-DD',
    TimeDate DATE FORMAT 'YYYY-MM-DD')
PRIMARY INDEX (SomeIndex)
ON COMMIT PRESERVE ROWS;

INSERT INTO TempTable VALUES(1,'2022-02-13','2023-09-10');
INSERT INTO TempTable VALUES(1,'2022-03-21','2023-09-11');
INSERT INTO TempTable VALUES(1,'2022-01-17','2023-09-12');
INSERT INTO TempTable VALUES(1,'2022-02-28','2023-09-13');
INSERT INTO TempTable VALUES(1,'2021-12-19','2023-09-14');
INSERT INTO TempTable VALUES(1,'2021-12-23','2023-09-15');
sql teradata window-functions teradatasql
1个回答
0
投票

您可以尝试使用相关子查询来实现此目的吗?我尝试过如下...

SELECT a.SomeIndex, a.ValueDate, a.TimeDate, b.ValueDate AS DesiredResult
FROM TempTable a LEFT JOIN TempTable b on b.TimeDate <= a.TimeDate
AND b.ValueDate = ( SELECT MIN(ValueDate) 
                    FROM TempTable c 
                    WHERE c.ValueDate > a.ValueDate AND c.TimeDate <= a.TimeDate)
ORDER BY a.TimeDate
© www.soinside.com 2019 - 2024. All rights reserved.