Как написать оператор SQL case с несколькими условиями для поиска по пользователю, используя group by? - PullRequest
0 голосов
/ 08 января 2020

Мне нужно искать в каждом отдельном пользователе, используя оператор case, который имеет несколько условий, прежде чем он станет истинным. Оператор должен выполнить поиск каждого пользователя, чтобы выяснить, поступили ли они последовательно, за исключением других дней.

select
    user_id,
    case
        when dates = 'Monday' and dates = 'Wednesday' then 'not_retained'
        when dates = 'Monday' and dates = 'Tuesday' and dates = 'Wednesday' then 'retained'
        else null
        end as retention_of_user
from
    retention_group
group by
    user_id,
    case
        when dates = 'Monday' and dates = 'Wednesday' then 'not_retained'
        when dates = 'Monday' and dates = 'Tuesday' and dates = 'Wednesday' then 'retained'
        else null
        end

Когда я использую запрос выше, оператор case возвращает нули

Я включил образец таблицы данных.

retinetion_group

user_id dates

User1   Monday
User1   Tuesday
User1   Wednesday

User2   Monday
User2   Wednesday

User3   Tuesday
User3   Monday
User3   Wednesday
User3   Wednesday

User4   Tuesday
User4   Wednesday

Вот результаты, которые я хотел бы получить.

Results
user_id retention_of_user

User1   retained
User2   not_retained
User3   retained
User4   NULL

Ответы [ 3 ]

1 голос
/ 08 января 2020

Ниже для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.retention_group` AS (
  SELECT 'User1' user_id, 'Monday' dates UNION ALL
  SELECT 'User1', 'Tuesday' UNION ALL
  SELECT 'User1', 'Wednesday' UNION ALL
  SELECT 'User2', 'Monday' UNION ALL
  SELECT 'User2', 'Wednesday' UNION ALL
  SELECT 'User3', 'Tuesday' UNION ALL
  SELECT 'User3', 'Monday' UNION ALL
  SELECT 'User3', 'Wednesday' UNION ALL
  SELECT 'User3', 'Wednesday' UNION ALL
  SELECT 'User4', 'Tuesday' UNION ALL
  SELECT 'User4', 'Wednesday' 
)
SELECT user_id, 
  CASE 
    WHEN 'Monday' IN UNNEST(dates) AND 'Tuesday' IN UNNEST(dates) AND 'Wednesday' IN UNNEST(dates) THEN 'retained'
    WHEN 'Monday' IN UNNEST(dates) AND 'Wednesday' IN UNNEST(dates) THEN 'not_retained'
    ELSE NULL
  END retention_of_user
FROM (
  SELECT user_id, ARRAY_AGG(DISTINCT dates) dates  
  FROM `project.dataset.retention_group`
  GROUP BY user_id
)   

с результатом

Row user_id retention_of_user    
1   User1   retained     
2   User2   not_retained     
3   User3   retained     
4   User4   null     
1 голос
/ 08 января 2020

Я думаю Вы хотите:

select user_id,
       (case when countif(dates = 'Monday') > 0 and countif(dates = 'Wednesday')
             then 'not_retained'
             when countif(dates = 'Monday') > 0 and countif(dates = 'Tuesday') > 0 and countif(dates = 'Wednesday') > 0 
             then 'retained'
             else null
        end) as retention_of_user
from retention_group
group by user_id;
0 голосов
/ 29 января 2020

Я закончил тем, что написал что-то вроде этого

select user_id,
       case
           when (select count(*) from retention_group x1 where x1.user_id = x._user_id and 
         x1.dates = 'Monday' ) >0
          and
             (select count(*) from retention_group x1 where x1.user_id = x._user_id and x1.dates = 'Tuesday' ) >0
            and
          (select count(*) from retention_group x1 where x1.user_id = x._user_id and x1.dates = 'Wednesday' ) >0
         then 'retained'

           when (select count(*) from retention_group x1 where x1.user_id = x._user_id and x1.dates = 'Monday' ) >0
           and
         (select count(*) from retention_group x1 where x1.user_id = x._user_id and x1.dates = 'Tuesday' ) =0
           and
          (select count(*) from retention_group x1 where x1.user_id = x._user_id and x1.dates = 'Wednesday' ) >0
           then 'not_retained'
           else NULL
       end as retaining
from 
    retention_group x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...