从 SQL 到 SPL:计算年月区间包含的所有年月
某库表的第 2 和第 3 个字段分别是起始年月和终止年月,格式是”年 M 月”。
Project |
ScenarioStart |
ScenarioEnd |
1 |
2024M9 |
2025M3 |
2 |
2024M6 |
2024M10 |
现在要增加计算列 TimePeriods:用起始年月和终止年月算出间隔为一个月的连续日期序列,用竖线拼接起来,日期格式保持”年 M 月”不变。
Project |
ScenarioStart |
ScenarioEnd |
TimePeriods |
1 |
2024M9 |
2025M3 |
2024M09|2024M10|2024M11|2024M12|2025M01|2025M02|2025M03 |
2 |
2024M6 |
2024M10 |
2024M06|2024M07|2024M08|2024M09|2024M10 |
SQL 没有直接生成日期序列的函数,通常要用 JOIN 或者递归间接生成多条记录,结构上非常复杂。有些数据库没有分组后拼接字符串的聚合函数,即使生成了多条记录的日期序列,再生成指定格式的字符串也仍然非常困难。
SPL 可以直接生成日期序列,也有强大的处理字段串集合的方法,再拼接成指定格式非常容易:
A |
|
1 |
=dbConn.query("select *, null as TimePeriods from tb”) |
2 |
=A1.run(#4=periods@m(date(#2,"yyyy'M'MM"),date(#3,"yyyy'M'MM"),1).(string(~,"yyyy'M'MM")).concat("|")) |
A1:从数据库加载数据,新增空字段TimePeriods。
A2:按指定格式识别起始和终止年月,生成间隔为 1 个月的日期序列,将序列的每个成员转为指定格式的字符串,用竖线拼起来。periods 可生成日期序列,@m 表示间隔单位为月。concat 用于拼接字符串集合。
英文版 https://c.scudata.com/article/1734597541052