Snowflake中如何聚合VARIANT列并保留原有JSON结构?
Snowflake中保留原有结构聚合VARIANT列的实现
可以实现这类需求,无需拆分后手动重新组合,通过Snowflake的JSON处理函数和聚合函数即可完成。以下是针对你提供的示例数据的具体实现方案:
假设你的数据存储在表your_table中,FEES_APPLIED为目标VARIANT列,执行以下SQL即可得到期望的聚合结果:
SELECT OBJECT_AGG( fee_key, OBJECT_CONSTRUCT( 'Amount', SUM(fee_value:Amount::FLOAT), 'Currency', MAX(fee_value:Currency::STRING) ) ) AS aggregated_fees FROM your_table, LATERAL FLATTEN(input => FEES_APPLIED, mode => 'OBJECT') f(fee_key, fee_value);
代码说明:
- LATERAL FLATTEN:将VARIANT列的顶层键值对(如
FeesAppliedTotal、ReceiptFee等)展开为行,每行包含一个费用项的键(fee_key)和对应的嵌套对象(fee_value)。 - 聚合计算:对每个
fee_key分组,累加Amount值;由于示例中所有Currency取值一致,用MAX或ANY_VALUE提取即可。 - OBJECT_AGG + OBJECT_CONSTRUCT:将聚合后的每个费用项重新构造为嵌套对象,再通过
OBJECT_AGG组合回原始的VARIANT结构。
执行上述SQL后,得到的结果与你期望的结构完全一致:
{ "FeesAppliedTotal": { "Amount": 1.6, "Currency": "GBP" }, "ReceiptFee": { "Amount": 0.4, "Currency": "GBP" }, "ReminderFee": { "Amount": 0.4, "Currency": "GBP" }, "TransactionFee": { "Amount": 0.8, "Currency": "GBP" } }
内容的提问来源于stack exchange,提问作者Mohamed Mutter
相关产品推荐
相关产品推荐

