Kategorien:

Aggregationsfunktionen (Semistrukturierte Daten), Fensterfunktionen (Allgemein), Funktionen für semistrukturierte und strukturierte Daten (Array/Objekt)

OBJECT_AGG

Gibt ein OBJECT pro Gruppe zurück. Bei jedem Eingabepaar (key, value) mit dem Schlüssel key vom Typ VARCHAR und dem Wert value vom Typ VARIANT enthält das resultierende OBJECT ein Feld key: value.

Aliasse:

OBJECTAGG

Syntax

Aggregatfunktion

OBJECT_AGG(<key>, <value>)
Copy

Fensterfunktionen

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

Nutzungshinweise

  • Eingabetupel, bei denen key und/oder value den Wert NULL haben, werden ignoriert.

  • Doppelte Schlüssel innerhalb einer Gruppe führen zu einem Duplicate field key 'key'-Fehler.

  • Das Schlüsselwort DISTINCT wird unterstützt, filtert jedoch nur doppelte Zeilen heraus, bei denen key und value identisch sind.

  • Bei Verwendung als Fensterfunktion:

    • Diese Funktion unterstützt nicht:

      • ORDER BY-Unterklausel in der OVER()-Klausel

      • Fensterrahmen

Beispiele

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

In diesem Beispiel wird OBJECT_AGG() als Aggregatfunktion verwendet:

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