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

如何在Snowflake中按wave计算预留纸箱数及其占总纸箱数的百分比

需求说明

仓库数据库采用任务型结构,包含字段:wave(波次)、carton(纸箱)、quantity_inCarton(纸箱内数量)、quantity_consumed(已消耗数量)、task status(任务状态)。规则如下:

  • 当status为0时,任务启动;
  • 当status为1时,纸箱送达并完成消耗,若此时quantity_inCarton与quantity_consumed数值不等,该纸箱进入预留状态。

现有SQL查询用于统计各波次中,满足「task不含K、status=1且数量不等」的预留纸箱数:

SELECT wave, COUNT(carton) 
From Database 
WHERE task NOT LIKE '%K%' 
AND status = '1' 
AND quantity_inCarton != quantity_consumed 
GROUP BY wave

现在需要为该查询新增一列,计算预留纸箱数占对应波次中「满足task不含K、status=1」的总纸箱数的百分比。


解决方案

方案1:使用窗口函数(简洁高效)

利用窗口函数直接在分组统计时获取对应波次的总纸箱数,无需额外关联查询:

SELECT 
    wave,
    COUNT(carton) AS reserved_carton_count,
    ROUND(
        COUNT(carton) * 100.0 / COUNT(*) OVER (PARTITION BY wave),
        2
    ) AS reserved_percentage
FROM Database
WHERE task NOT LIKE '%K%' 
  AND status = '1'
GROUP BY wave
-- 可选:过滤掉无预留纸箱的波次
HAVING COUNT(carton) > 0;
  • COUNT(*) OVER (PARTITION BY wave):按波次分组,统计当前波次下符合task不含K、status=1的总纸箱数;
  • ROUND(..., 2):将百分比结果保留两位小数,可根据需求调整小数位数。

方案2:子查询关联(逻辑清晰)

通过两个子查询分别统计各波次的预留纸箱数和总纸箱数,再关联计算百分比:

SELECT 
    t1.wave,
    t1.reserved_count,
    ROUND(t1.reserved_count * 100.0 / t2.total_count, 2) AS reserved_percentage
FROM (
    -- 统计各波次的预留纸箱数
    SELECT wave, COUNT(carton) AS reserved_count
    FROM Database
    WHERE task NOT LIKE '%K%' 
      AND status = '1' 
      AND quantity_inCarton != quantity_consumed
    GROUP BY wave
) t1
JOIN (
    -- 统计各波次符合条件的总纸箱数
    SELECT wave, COUNT(carton) AS total_count
    FROM Database
    WHERE task NOT LIKE '%K%' 
      AND status = '1'
    GROUP BY wave
) t2 ON t1.wave = t2.wave;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:06:01