【问题标题】:Is there a way I can aggregate values within a VARIANT column in Snowflake?有没有办法可以在 Snowflake 的 VARIANT 列中聚合值?
【发布时间】:2022-10-24 20:59:43
【问题描述】:

我想聚合一个 VARIANT 列,同时保持相同的结构而不破坏它然后再次编译。

例如:

FEES_APPLIED

{   "FeesAppliedTotal": {     "Amount": 0.4,     "Currency": "GBP"   },   "ReceiptFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "ReminderFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "TransactionFee": {     "Amount": 0.2,     "Currency": "GBP"   } }
{   "FeesAppliedTotal": {     "Amount": 0.4,     "Currency": "GBP"   },   "ReceiptFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "ReminderFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "TransactionFee": {     "Amount": 0.2,     "Currency": "GBP"   } }
{   "FeesAppliedTotal": {     "Amount": 0.4,     "Currency": "GBP"   },   "ReceiptFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "ReminderFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "TransactionFee": {     "Amount": 0.2,     "Currency": "GBP"   } }
{   "FeesAppliedTotal": {     "Amount": 0.4,     "Currency": "GBP"   },   "ReceiptFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "ReminderFee": {     "Amount": 0.1,     "Currency": "GBP"   },   "TransactionFee": {     "Amount": 0.2,     "Currency": "GBP"   } }

输出应该是:

{   "FeesAppliedTotal": {     "Amount": 1.6,     "Currency": "GBP"   },   "ReceiptFee": {     "Amount": 0.4,     "Currency": "GBP"   },   "ReminderFee": {     "Amount": 0.4,     "Currency": "GBP"   },   "TransactionFee": {     "Amount": 0.8,     "Currency": "GBP"   } }

这可能吗?

【问题讨论】:

  • 顶部示例中的 JSON 仅在它位于不同的行中或者它是变体列中的数组(或者可能是其他东西)时才有效。这些是单独的行吗?对于像“GBP”这样无法求和的字段,它们是否总是相同的值,或者这会产生单独的行,如按表达式分组?
  • 是的,第一个 JSON 是 4 个单独的行。并且 Currency 列对于同一组的键将具有相同的值。
  • 我不相信您可以在将数据保留为 JSON 的同时做到这一点 - 但您可能可以在 SQL 语句中这样做(即您不必将 JSON 转换为表中的物理列)。使用 CTE 可能最容易做到这一点,例如第一个 CTE 从 JSON 中获取列,第二个 CTE 使用第一个 CTE 结果进行分组,最后将第二个 CTE 的结果转换回 JSON

标签: snowflake-cloud-data-platform aggregate-functions variant


【解决方案1】:

不,这是不可能的。您应该解析 JSON 以获取值,进行计算,然后重建 JSON:

select object_agg( key, value ) as result from (
select f.key, object_construct('Amount', sum(f.VALUE:Amount::NUMBER(2,1)), 'Currency', 'GBP' ) value from my_table,
lateral flatten( v ) f
group by f.key);

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                             RESULT                                                                                                              |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| { "FeesAppliedTotal": { "Amount": 1.6, "Currency": "GBP" }, "ReceiptFee": { "Amount": 0.4, "Currency": "GBP" }, "ReminderFee": { "Amount": 0.4, "Currency": "GBP"   }, "TransactionFee": { "Amount": 0.8, "Currency": "GBP" } } |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多