sql - 通过在 Snowflake SQL 中按条件进行子聚合来创建列
问题描述
我有下表:
id1 | id2 | n_products | daydiff
a | 1 | 12 | 12
a | 1 | 11 | 13
a | 1 | 90 | 46
a | 2 | 5 | 5
b | 2 | 15 | 15
b | 2 | 15 | 21
c | 3 | 90 | 7
我需要通过以下方式聚合此表id
并使用:daydiff
- 如果
daydiff
小于 14 - 如果
daydiff
在 14 到 28 之间 - 如果
daydiff
大于 28。
这应该使用平均值进行汇总。
结果应该是:
id1 | id2 | sub 14 | 14_28 | 28+
a | 1 | 11.5 | 0 | 46
a | 2 | 5 | 0 | 0
b | 2 | 0 | 15 | 0
a | 3 | 7 | 0 | 0
我怎样才能做到这一点?我想这将涉及一些group by
陈述,但我不确定应该如何应用它们
解决方案
使用条件聚合:
select id1, id2,
avg(case when datediff < 14 then n_products end) as avg_lt14,
avg(case when datediff >= 14 and datediff <= 28 then n_products end) as avg_14_28,
avg(case when datediff > 29 then n_products end) as avg_29pl
from t
group by id1, id2;
一些数据库将整数的平均值计算为整数。我不知道雪花是否这样做。如果是这样,则更n_products
改为n_products * 1.0
.
推荐阅读
- symfony - 清漆恐慌 - 放弃日志(vsl)
- azure-traffic-manager - Azure 流量管理器可用性
- java - Java ProcessBuilder:curl:(1)libcurl中不支持或禁用协议“'https”
- javascript - 如何以角度 4 捕获图像元数据
- php - 未指定phpcs版本
- excel - Visual Basic Datagridview到带有主键的mysql(按顺序自动生成的数字)
- oracle - SQL Developer 特殊字符
- yocto - 在 yocto 中添加新食谱
- c# - 结合 List<> 但与每个匹配的逻辑
- android - Oppo手机在通知栏显示黄线