Есть ли в Snowflake SQL агрегатная функция И / ИЛИ для логических типов? - PullRequest
0 голосов
/ 29 октября 2019

Учитывая, что у меня есть такая таблица

ID  X
1   TRUE
1   FALSE
2   FALSE
2   FALSE

Я бы хотел добиться следующего результата:

ID  BOOL_OR(X)
1   TRUE
2   FALSE

То есть я хочу GROUP BY ID и агрегироватьлогические значения X с использованием логического оператора OR.

В PostgreSQL есть bool_or(), который я могу использовать следующим образом

with t1 as
         (
             select *
             from (values (1, true)
                        , (1, false)
                        , (2, false)
                        , (2, false)) AS t1 (id, x)
         )
select id, bool_or(x)
from t1
group by id;
-- results
ID  BOOL_OR(X)
1   TRUE
2   FALSE

Тот же запрос в Snowflake SQL дает SQL compilation error: Invalid identifier BOOL_OR, что неудивительно, поскольку в документации Snowflake для агрегатных функций нет списка BOOL_OR.

Итак, у меня вопрос, есть ли другой альтернативный способ получить те же эффекты, что и в PostgreSQL bool_or и bool_and в Snowflake SQL?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

В Snowflake есть функция boolor (), но это не одно и то же. То, что вы хотите использовать, - это функция снежинки bitor_agg (), которая выполняет ту же логику, но с битовым значением. Функция немного неуклюжа, потому что она использует целочисленный эквивалент логического, а не непосредственно логического. Итак, в вашем примере:

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;

Преобразование внутри функции делает значения целыми для функции bitor_agg (), а затем внешнее логическое преобразование возвращает его к логическому для вас.

https://docs.snowflake.net/manuals/sql-reference/functions/bitor_agg.html

1 голос
/ 30 октября 2019

ОБНОВЛЕНИЕ 2019-11-04

Snowflake недавно представила BOOLOR_AGG и BOOLAND_AGG функции, которые должны обеспечивать желаемую функциональность.

Оригинальный ответ

MIN и MAX функции в Snowflake, кажется, делают то, что вы ожидаете от логических значений, с MIN, работающим как BOOL_AND / AND_AGGи MAX работает как BOOL_OR / OR_AGG.

См. этот пример:

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     |
-----------+-----------+-----------+-----------+-----------+-----------+

Обратите внимание, что это официально не задокументировано, поэтому используйте на свой страх и риск :)

...