Teradata中基于初始库存生成在库滚动余额的SQL实现
Teradata中实现从首个非零initial日期开始的滚动BOH计算
需求说明
现有Teradata查询从sample表返回date、initial、sales、deliveries字段,需新增**BOH(在库滚动余额)**列,计算规则为:
- 核心公式:
BOH = initial - sales + deliveries - 仅从第一个
initial不为0的日期开始滚动累计该公式的结果 - 首个有效日期之前的所有行,BOH固定为0
解决方案SQL
WITH sample_with_first_valid AS ( SELECT date, initial, sales, deliveries, -- 获取全表中第一个initial非零的日期 MIN(CASE WHEN initial > 0 THEN date END) OVER () AS first_valid_date FROM sample ), daily_balance_changes AS ( SELECT date, initial, sales, deliveries, first_valid_date, -- 计算当日余额变动值 initial - sales + deliveries AS daily_change FROM sample_with_first_valid ) SELECT date, initial, sales, deliveries, -- 按日期判断是否进入有效计算区间,生成BOH值 CASE WHEN date >= first_valid_date THEN SUM(daily_change) OVER (ORDER BY date) ELSE 0 END AS boh FROM daily_balance_changes ORDER BY date;
逻辑解释
- 定位首个有效日期:通过
MIN(CASE WHEN initial > 0 THEN date END) OVER ()窗口函数,找出整个数据集里第一个initial不为0的日期,每行都会携带这个日期标记first_valid_date。 - 计算日变动值:基于核心公式算出每行的当日余额变动量
daily_change。 - 生成滚动BOH:用
CASE判断当前日期是否在首个有效日期之后:- 若是:通过
SUM(daily_change) OVER (ORDER BY date)从首个有效日期开始滚动累计变动值,得到当前BOH。 - 若否:直接返回0。
- 若是:通过
验证示例数据
针对题目给出的示例数据,执行上述SQL后会得到与期望完全一致的输出:
| date | initial | sales | deliveries | boh |
|---|---|---|---|---|
| 01-01 | 0 | 2 | 4 | 0 |
| 01-02 | 0 | 0 | 0 | 0 |
| 01-03 | 3 | 1 | 0 | 2 |
| 01-04 | 0 | 4 | 8 | 6 |
| 01-05 | 0 | 2 | 2 | 6 |
| 01-06 | 0 | 1 | 3 | 8 |
内容的提问来源于stack exchange,提问作者feonyte
相关产品推荐
相关产品推荐

