Calcul des intersections, unions et différences de tableaux dans ClickHouse

Dans ClickHouse, les opérations sur les tableaux telles que l'intersection, l'union et la différence peuvent être effectuées à l'aide de fonctions intégrées et de clauses SQL spécifiques.

Intersection de tableaux

La fonction arrayIntersect(arr1, arr2, ...) retourne un sous-tableau contenant les éléments communs aux tableaux d'entrée. Exemple :

SELECT
    arrayIntersect([10, 20, 30], [40, 50, 60]) AS aucune_intersection,
    arrayIntersect([10, 20, 30], [20, 30, 40, 50, 60]) AS intersection_existe
FORMAT Vertical

Résultat : aucune_intersection: [] ; intersection_existe: [30,20]

Union de tableaux

L'union de tableaux est réalisée en combinant arrayDistinct et arrayConcat pour éliminer les doublons. Exemple :

SELECT
    [10, 20] AS tableau_un,
    [20, 30] AS tableau_deux,
    arrayDistinct(arrayConcat(tableau_un, tableau_deux)) AS resultat_union
FORMAT Vertical

Résultat : tableau_un: [10,20] tableau_deux: [20,30] resultat_union: [10,20,30]

Différence de tableaux

La différence n'a pas de fonction dédiée, mais peut être implémentée en utilisant arrayIntersect avec les fonctions d'ordre supérieur arrayMap et arrayFilter. Exemple :

SELECT
    [10, 20] AS source_tableau,
    [20, 30] AS tableau_exclu,
    arrayFilter(x -> (x IS NOT NULL), arrayMap(x -> multiIf(x NOT IN arrayIntersect(source_tableau, tableau_exclu), x, NULL), source_tableau)) AS difference_resultat
FORMAT Vertical

Résultat : source_tableau: [10,20] tableau_exclu: [20,30] difference_resultat: [10]

Utilisation des clauses SQL pour les opérations ensemblistes

ClickHouse supporte les clauses SQL INTERSECT, UNION et EXCEPT pour les opérations sur les ensembles dérivés de tableuax.

Intersection avec INTERSECT :

SELECT a.item
FROM
(
    SELECT arrayJoin([10, 20]) AS item
) AS a
INTERSECT
SELECT b.item
FROM
(
    SELECT arrayJoin([20, 30]) AS item
) AS b

Résultat : 20

Union avec UNION et DISTINCT :

SET union_default_mode = 'ALL';
SELECT DISTINCT t.item
FROM
(
    SELECT a.item
    FROM
    (
        SELECT arrayJoin([10, 20]) AS item
    ) AS a
    UNION
    SELECT b.item
    FROM
    (
        SELECT arrayJoin([20, 30]) AS item
    ) AS b
) AS t

Résultat : 10 20 30

Différence avec EXCEPT :

SELECT a.item
FROM
(
    SELECT arrayJoin([10, 20]) AS item
) AS a
EXCEPT
SELECT b.item
FROM
(
    SELECT arrayJoin([20, 30]) AS item
) AS b

Résultat : 10

Les fonctions clés utilisées incluent arrayIntersect pour les intersections, arrayConcat pour la concaténation, arrayDistinct pour la déduplication, arrayMap pour la transformation par lambda et arrayFilter pour le filtrage par lambda.

Étiquettes: ClickHouse SQL Arrays Array Functions INTERSECT

Publié le 25 juin à 03h36