You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑解释

  1. 定位首个有效日期:通过MIN(CASE WHEN initial > 0 THEN date END) OVER ()窗口函数,找出整个数据集里第一个initial不为0的日期,每行都会携带这个日期标记first_valid_date。
  2. 计算日变动值:基于核心公式算出每行的当日余额变动量daily_change。
  3. 生成滚动BOH:用CASE判断当前日期是否在首个有效日期之后:
    • 若是:通过SUM(daily_change) OVER (ORDER BY date)从首个有效日期开始滚动累计变动值,得到当前BOH。
    • 若否:直接返回0。

验证示例数据

针对题目给出的示例数据,执行上述SQL后会得到与期望完全一致的输出:

dateinitialsalesdeliveriesboh
01-010240
01-020000
01-033102
01-040486
01-050226
01-060138

内容的提问来源于stack exchange,提问作者feonyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:37:47