Catégories :

Fonctions d’agrégation (Données semi-structurées) , Fonctions de la fenêtre (Général) , Fonctions de données semi-structurées (Tableau/Objet)

OBJECT_AGG

Renvoie un OBJECT par groupe. Pour chaque paire d’entrées (clé, valeur), où clé doit être un VARCHAR et valeur doit être un VARIANT, l’OBJECT résultant contient un champ clé : valeur.

Alias :

OBJECTAGG

Syntaxe

Fonction d’agrégation

OBJECT_AGG(<key>, <value>)

Fonction de fenêtre

OBJECT_AGG(<key>, <value>)
    OVER ( [ PARTITION BY <expr2> ] )
    [ WITHIN GROUP ( <orderby_clause> ) ]

Notes sur l’utilisation

  • Les tuples d’entrée avec clé NULL et/ou valeur sont ignorés.

  • Les clés en double dans un groupe entraînent une erreur.

  • Le mot-clé DISTINCT est pris en charge, mais il ne filtre que les lignes en double pour lesquelles clé et valeur sont égales.

  • Lorsqu’il est utilisé comme une fonction de fenêtre :

    • Cette fonction ne prend pas en charge :

      • Sous-clause ORDER BY dans la clause OVER().

      • Cadres de fenêtre.

Exemples

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 |
---+------+-------+
SELECT objectagg(k, v) FROM objectagg_example GROUP BY g;

------------------+
 OBJECTAGG(K, V)  |
------------------+
 {                |
   "name": "Sue", |
   "zip": 94401   |
 }                |
 {                |
   "age": 21,     |
   "name": "Joe"  |
 }                |
------------------+
SELECT seq, key, value
FROM (SELECT objectagg(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" |
-----+------+-------+