如何在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
相关产品推荐
相关产品推荐

