Как подсчитать случаи поведения клиентов, происходящие в один и тот же день?

#sql

Вопрос:

У меня есть проблема, связанная с sql, которую я пытался выяснить.. Существует таблица данных о клиентах с двумя типами взаимодействий (разные столбцы) и соответствующей датой. Я развернул таблицу, поэтому вместо этого данные выглядят следующим образом:

идентификатор (int) текст события/логическое значение (1 или 0) Дата
1 1 2021/10/1
1 0 2021/10/1
2 1 2021/9/26
2 0 2021/9/24

и т.д.. То, что я пытаюсь сделать, — это подсчитать количество случаев, когда в одну и ту же дату происходит событие 1 и 0, всего для всех клиентов. Возможно, даже подсчет в пределах диапазона дат был бы полезен.. Спасибо!

Ответ №1:

Общим подходом было бы:

 SELECT COUNT(*)
FROM
(
    SELECT date
    FROM yourTable
    WHERE event IN (0, 1)   -- can add date range here
    GROUP BY date
    HAVING MIN(event) <> MAX(event)
) t;
 

Комментарии:

1. Спасибо за ваш ответ, так просто! Первоначально я выполнял другой запрос с использованием CTE и пытался выполнить сборку, которая сильно усложняла мои задачи ..

Ответ №2:

Вы можете использовать sum с group by :

 with cte(date, pos, neg) as (
    select date, sum(event = 1), sum(event = 0) from events group by date
)
select * from cte where pos > 0 and neg > 0;
 

Редактировать: без cte :

 select * from (select date, sum(event = 1) pos, sum(event = 0) neg from events group by date) 
where pos > 0 and neg > 0;
 

Комментарии:

1. Спасибо за ваш ответ .. Первоначально я использовал CTE для выполнения другого запроса, поэтому я пытался выполнить следующий шаг с помощью CTE, но другой ответ был проще/вырезал шаг..

2. @NickC Пожалуйста, посмотрите мою недавнюю правку, я добавил версию, которая не использует cte .