类别:

/sql-reference/functions-aggregation`(半结构化数据)、:doc:/sql-reference/functions-analytic`(常规)、:doc:`/sql-reference/functions-semistructured`(数组/对象)

OBJECT_AGG

每组返回一个 OBJECT。对于每个(keyvalue)输入对(其中 key 必须是 VARCHAR,value 必须是 VARIANT),生成的 OBJECT 包含一个 key:value 字段。

别名:

OBJECTAGG

语法

聚合函数

OBJECT_AGG(<key>, <value>)
Copy

窗口函数

OBJECT_AGG(<key>, <value>)
    OVER ( [ PARTITION BY <expr2> ] )
Copy

使用说明

  • key 和/或 value 为 NULL 的输入元组将被忽略。

  • 组中的重复键会导致 Duplicate field key 'key' 错误。

  • 支持 DISTINCT 关键字,但它只会过滤掉 keyvalue 相等的重复行。

  • 用作窗口函数时:

    • 此函数不支持:

      • OVER() 子句中的 ORDER BY 分子句。

      • 窗口框架。

示例

CREATE OR REPLACE TABLE objectagg_example(g NUMBER, k VARCHAR(30), v VARIANT);
    INSERT INTO objectagg_example SELECT 0, 'name', 'Joe'::variant;
    INSERT INTO objectagg_example SELECT 0, 'age', 21::variant;
    INSERT INTO objectagg_example SELECT 1, 'name', 'Sue'::variant;
    INSERT INTO objectagg_example SELECT 1, 'zip', 94401::variant;

SELECT * FROM objectagg_example;

---+------+-------+
 G |  K   |   V   |
---+------+-------+
 0 | name | "Joe" |
 0 | age  | 21    |
 1 | name | "Sue" |
 1 | zip  | 94401 |
---+------+-------+
Copy

此示例使用 OBJECT_AGG() 作为聚合函数:

SELECT object_agg(k, v) FROM objectagg_example GROUP BY g;

-------------------+
 OBJECT_AGG(K, V)  |
-------------------+
 {                 |
   "name": "Sue",  |
   "zip": 94401    |
 }                 |
 {                 |
   "age": 21,      |
   "name": "Joe"   |
 }                 |
-------------------+
Copy
SELECT seq, key, value
FROM (SELECT object_agg(k, v) o FROM objectagg_example GROUP BY g),
    LATERAL FLATTEN(input => o);

-----+------+-------+
 SEQ | KEY  | VALUE |
-----+------+-------+
 1   | name | "Sue" |
 1   | zip  | 94401 |
 2   | age  | 21    |
 2   | name | "Joe" |
-----+------+-------+
Copy
语言: 中文