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

如何按日期排序JSON列中分组后的交易记录?

问题描述

现有product_history表,结构包含Product_ID、TRX_DT、TRX_AMT字段,数据如下:

Product_IDTRX_DTTRX_AMT
AB-0012022-10-01576.06
AB-0012022-02-02864.56
AB-0012020-08-27698.20
AB-0012006-09-01468.36
AB-0082017-10-14357.58
AB-0082020-11-17950.14
AB-0082012-05-07120.06
AB-0082008-01-01267.52

使用以下SQL按Product_ID分组生成包含交易信息的JSON列:

SELECT 
    TO_JSON(
        OBJECT_CONSTRUCT_KEEP_NULL(
            'Product_ID', ANY_VALUE(t.Product_ID),
            'Transactions', ARRAY_AGG(
                    OBJECT_CONSTRUCT_KEEP_NULL(
                      'TRANSACTION_DATE', t.TRX_DT,
                      'TRANSACTION_AMOUNT', t.TRX_AMT
                    )
                     ))
            ) AS json,
    CONCAT(
        'Company_', 
        '_', t.Product_ID 
            ) AS product_code
FROM product_history AS t
GROUP BY t.Product_ID

目前已成功生成按产品分组的JSON列,但Transactions数组内的交易未按TRX_DT升序排列。尝试在语句末尾添加ORDER BY t.Product_ID, t.TRX_DT未生效,如何解决?

解决方法

你之前添加的ORDER BY是对分组后的整条数据排序,而非ARRAY_AGG生成的数组内部元素排序。要让数组内的交易按日期升序排列,需要在ARRAY_AGG函数内部指定排序规则。

修改后的SQL如下:

SELECT 
    TO_JSON(
        OBJECT_CONSTRUCT_KEEP_NULL(
            'Product_ID', ANY_VALUE(t.Product_ID),
            'Transactions', ARRAY_AGG(
                    OBJECT_CONSTRUCT_KEEP_NULL(
                      'TRANSACTION_DATE', t.TRX_DT,
                      'TRANSACTION_AMOUNT', t.TRX_AMT
                    )
                    -- 在ARRAY_AGG内部添加排序规则
                    ORDER BY t.TRX_DT ASC
                     ))
            ) AS json,
    CONCAT('Company_', '_', t.Product_ID) AS product_code
FROM product_history AS t
GROUP BY t.Product_ID

关键说明

  • ARRAY_AGG函数支持在内部通过ORDER BY子句指定聚合时的排序逻辑,生成的数组元素会按照TRX_DT升序排列。
  • 外部的ORDER BY仅控制最终结果集中行的顺序,不会影响数组内部元素的顺序,因此之前的尝试无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:50:23