求助:SPL 基于 "当前" 的相对位移

SPL 在循环函数中设计了一个很好用的功能,可以引用当前值的相邻值,比如 ~[-a] 表示当前值的前面第 a 个,~[b] 表示当前值之后的第 b 个,甚至可以用 ~[a:b] 来表示一个滑动窗口,波浪线也可以换成字段名。这个功能在文章 【程序设计】5.3 [一把抓] 循环函数进阶 有详细的解释。

我的想法是,"当前" 是不是可以有两种,一种是基于位置,比如刚刚所说的基于行,行的位置是相对固定的,总有首行、尾行、前面一行、后面一行的位置存在;另一种是基于范围的,范围可以是时间范围,比如,3 天前,两天后,或者前 12 个月,等等。这样的日期时间序列如果反映在日历表上,跟一个表结构中行的位置一样,必须存在这样的位置,不可能出现某一天在时空意义上的消失。那如果把日期时间序列反映在一个序时流水账上,某一天的交易是极有可能不存在的,比如证券交易碰到法定节假日是没有交易发生的,或者公司的业务在某一天没有新的订单生成,等等,很普遍。也就是说,在序时账上,日期时间即使有序,但也有可能会因为没有交易而缺失,这样的话在序时账上基于行的相对位置对日期时间来说可能是不准的,比如当前行的前 3 行,可能是当前行所在日期的 3 天前,也有可能不存在 3 天前,举个简单的例子如下,日期是按第一列分段有序的,想实现日期时间意义上的前 3 天后 3 天的取值,并不是取满数量意义上的 7 天。观察第 2 行中的 2024-01-13,该日期前三天后三天的值,发现只有当前的 13 号和后面的 14 号,其它符合条件的时间没有,只有两天,其它的以此类推。

imagepng

这样的取值需求在业务上也是有意义的,取决于如何分析。要如何才能实现这样的取值:

1、基于当前行的日期,上下偏移固定数量的行数模拟滑动窗口,再用 select 函数,筛选出符合日期时间范围的行。这样的时间复杂度相对于全表遍历会低很多,因为有滑动窗口的限制,控制了遍历的量。此时就能利用 SPL 中基于行位置的相对位移 ~[a:b] 来控制窗口大小。因为正常来说窗口大小是事先知道的,比如,7 天移动平均,或者 Trailing Twelve Month,等等。

2、寻求其它方法来实现这种计算,比如 PowerPivot Dax 的时间智能函数系列,或者有些 SQL 的窗口函数支持范围取值 (Range Frame),“…range between interval 3 days preceding and interval 3 days following”。

那我的想法是,SPL 能否实现这种针对日期时间的基于范围的偏移,按颗粒度分可以基于年,月,日,周,时、分、秒。比如这个例子中,简单地写成,序时表.derive(偏移 @day( 日期列, 上偏移: 下偏移): 字段名 ),握艹😄 这是不是跟 get 函数有点像,get(level,F;a:b)。甚至是按数值的大小来实现一个区间的滑动偏移。

描述的比较啰嗦,或许是我想多了😄 但还是恳请大佬们得闲时给予指导帮助,谢谢!

Till good is better, but better best ! 😄 🙏