SQL - проверка на наличие данных в течение каждого дня набора данных - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть набор данных, использующий Google BigQuery, для диапазона дат.Данные выглядят следующим образом:

id   date         value1   value2
--   ---------    ------   ------
1    01-feb-2019  1        2
2    01-feb-2019  2        2
3    02-feb-2019  1        2
4    02-feb-2019  2        2

Я хочу проверять наличие записи в каждый конкретный день, которая соответствует заданному правилу, и возвращать «статус» для этого дня, основываясь на том, что это правило являетсявстретились.Так, например, мое правило может состоять в том, чтобы возвращать статус 1 для дня, если есть какая-либо запись для этого дня, где value1 = 1 и value2 = 2

Мой конечный набор результатов для вышеуказанных данных будет выглядетьнапример:

date            status
----            ------
01-feb-2019     1
02-feb-2019     1

Я также хочу проверять правила 2nd и 3rd для каждого дня и возвращать различные коды состояния, если эти другие правила соблюдены.Как я могу сделать это в одном запросе SQL (я не против подвыборов и т.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Итак, я добавляю правило 1, и если вы хотите добавить больше правил, просто добавьте больше WHEN , THEN и так далее ...

select *
from (select date,
             (case
                when value1 = 1 AND value2 = 2 then 1 -- Rule1
             -- when value1 = .. AND value2 = .. then .. -- Rule2
             -- when value1 = ... AND value2 = ... then ... -- Rule3
                else 0
               end) as status
      from test
      group by date, status) as test
where status > 0;
0 голосов
/ 27 февраля 2019

Я использовал подход @Gordon Linoff.Чтобы получить дополнительные правила, я использую вложенные операторы case.В моем случае 3-е правило применяется, если первые 2 правила не выполнены, поэтому я делаю это:

select date,
       (case when sum(case when value1 = 1 then 1 else 0 end) > 0 and
                  sum(case when value2 = 2 then 1 else 0 end) > 0 
             then 2 -- 1st rule applies
        else
          case when sum(case when value1 = 2 then 1 else 0 end) > 0 and
                  sum(case when value2 = 2 then 1 else 0 end) > 0 
             then 1 -- 2nd rule applies
             else
                  0 -- 3rd rule applies
             end
        end) as status
from t
group by date;
0 голосов
/ 27 февраля 2019

Использование агрегации:

select date,
       (case when sum(case when value1 = 1 then 1 else 0 end) > 0 and
                  sum(case when value2 = 2 then 1 else 0 end) > 0 
             then 1 else 0
        end) as status
from t
group by date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...