#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
.