étant donné que j'ai une table comme celle-ci J'aimerais obtenir le résultat suivant: p> c'est-à-dire c'est, i Voulez-vous code> groupe par ID code> et agréger les valeurs booléennes de postgreSQL a la même requête dans le flocon de neige SQL donne Donc, ma question est là une autre solution alternative d'obtenir les mêmes effets que PostgreSQL's x code> à l'aide du booléen ou de l'opérateur. P> bool_or () code > que je peux utiliser comme ceci p> Erreur de compilation SQL: Identificateur non valide BOOL_OR CODE>, qui est pas de surprise forte> depuis le Documentation de flocon de neige pour fonctions agrégées ne liste pas bool_or code>. P> bool_or code> et bool_and code> dans le flocon de neige SQL? P> p>
3 Réponses :
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;
FYI - Il y a aussi bitand_agg () et bitxor_agg ().
update 2019-11-04 strong> flocon de neige a récemment introduit Réponse originale forte> P> Voir cet exemple: p> boolor_agg code> et booland_agg code> fonctions qui devrait fournir la fonctionnalité souhaitée. 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> 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 |
-----------+-----------+-----------+-----------+-----------+-----------+
Le point d'utiliser bool_and code> 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 () code> décidera qu'il évalue comme vrai dès qu'il voit une valeur code> true code> tandis que min () code> 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.
Je vais proposer quelque chose de beaucoup plus simple:
Utilisez max code> pour et code> et utilisez min code> pour ou code>.
Oui, vous devrez peut-être lancer l'argument pour :: entier mais c'est un petit prix à payer.
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.