0
votes

Y a-t-il une fonction agrégée et / ou pour des types booléens dans SnowfLake SQL?

étant donné que j'ai une table comme celle-ci xxx

J'aimerais obtenir le résultat suivant: xxx

c'est-à-dire c'est, i Voulez-vous groupe par ID et agréger les valeurs booléennes de x à l'aide du booléen ou de l'opérateur.

postgreSQL a bool_or () que je peux utiliser comme ceci xxx

la même requête dans le flocon de neige SQL donne Erreur de compilation SQL: Identificateur non valide BOOL_OR , qui est pas de surprise depuis le Documentation de flocon de neige pour fonctions agrégées ne liste pas bool_or .

Donc, ma question est là une autre solution alternative d'obtenir les mêmes effets que PostgreSQL's bool_or et bool_and dans le flocon de neige SQL?


0 commentaires

3 Réponses :


2
votes

Il y a une fonction boolor () dans le flocon de neige, mais ce n'est pas la même chose. Ce que vous voulez utiliser est la fonction Snowflake Bitor_Agg (), qui fait la même logique, mais sur une valeur de bits. La fonction est un peu maladroite car elle utilise l'équivalent entier d'un booléen, plutôt que d'une booléenne directement. Donc, dans votre exemple:

with t1 as
         (
             select $1 as id, $2 as x
             from (values (1, true)
                        , (1, false)
                        , (2, false)
                        , (2, false)) AS t1
         )
select id, bitor_agg(x::integer)::boolean
from t1
group by id;


1 commentaires

FYI - Il y a aussi bitand_agg () et bitxor_agg ().



2
votes

update 2019-11-04 strong>

flocon de neige a récemment introduit boolor_agg code> et booland_agg code> fonctions qui devrait fournir la fonctionnalité souhaitée. p>

Réponse originale forte> P>

min code> et max code> Fonctions dans le flocon de neige semblent faire ce que vous attendez pour booléens, avec min code> fonctionne comme bool_and / and_agg code> et avec max code> fonctionne comme bool_or / or_agg code>. p>

Voir cet exemple: p>

create or replace table x(col1 boolean, col2 boolean, col3 boolean);
insert into x values(true, true, false),(true,false,false);
select * from x;
------+-------+-------+
 COL1 | COL2  | COL3  |
------+-------+-------+
 TRUE | TRUE  | FALSE |
 TRUE | FALSE | FALSE |
------+-------+-------+

select min(col1),max(col1),min(col2),max(col2),min(col3),max(col3) from x;
-----------+-----------+-----------+-----------+-----------+-----------+
 MIN(COL1) | MAX(COL1) | MIN(COL2) | MAX(COL2) | MIN(COL3) | MAX(COL3) |
-----------+-----------+-----------+-----------+-----------+-----------+
 TRUE      | TRUE      | FALSE     | TRUE      | FALSE     | FALSE     |
-----------+-----------+-----------+-----------+-----------+-----------+


2 commentaires

Le point d'utiliser bool_and est qu'il calculera plus rapidement pour les groupes plus importants. Imaginez qu'il y a des millions de valeurs de livre dans chaque groupe: bool_or () décidera qu'il évalue comme vrai dès qu'il voit une valeur true tandis que min () nécessite (au moins je le pense) pour analyser toutes les valeurs.


C'est un commentaire équitable, mais faire cette optimisation (correctement) en général serait extrêmement compliqué et je doute que les bases de données le font. Vous pouvez bien sûr arrêter de traiter BOOL_OR ou BOOL_AND lorsque vous appuyez sur VRAI ou FAUX, REEE, mais pour éviter de numériser la colonne correspondante ou l'informatique, l'expression d'entrée serait très difficile dans la plupart des systèmes.



0
votes

Je vais proposer quelque chose de beaucoup plus simple: Utilisez max pour et et utilisez min pour ou . Oui, vous devrez peut-être lancer l'argument pour :: entier mais c'est un petit prix à payer. XXX


1 commentaires

Je ne pense pas que le casting est le problème. Le problème est que Max et Min doivent numériser toutes les valeurs et Boolor_Agg finira dès qu'une véritable valeur est trouvée. Si vous traitez des millions de lignes, cela fait une différence.