#hive #conditional
#улей #условные операторы
Вопрос:
У меня есть таблица, содержащая данные за год с количеством покупок в месяц на одного клиента. Это выглядит так:
ID MON NUM_PURCHASES
1 1 1
2 1 3
3 1 4
2 2 5
(где ID — это идентификатор клиента, mon — месяц в году). Я хочу выбрать все идентификаторы, которые имеют по крайней мере 1 покупку в месяц в течение года.
Я ищу более элегантное решение, чем (это не работает — см. Мою правку 2019-04-03):
SELECT distinct id
FROM my_table
where (num_purchases >= 1 and mon = 1) and
(num_purchases >= 1 and mon = 2) and ...
(num_purchases >= 1 and mon = 12);
(Обратите внимание, что «…» обозначает все значения mon от 1 до 12)
Какой более элегантный способ сделать это? Спасибо.
РЕДАКТИРОВАТЬ (2019-04-03):
Я понимаю, насколько нелеп запрос выше — он никогда ничего не вернет, если я не преобразоваю таблицу и не помещу все записи от одного клиента в одну строку :/.
После ответа Vamsi я понял, что не упомянул, что моя таблица не содержит записей с 0 покупками за месяц, она содержит данные (для клиента) только в том случае, если он совершил покупку за месяц (поэтому несколько месяцев отсутствуют).).
Благодаря решению Vamsi я нашел обходной путь как:
select id, total_purchases
FROM
(select id, SUM(CAST(mon as int)) as sum_mon, SUM(CAST(num_purchases as int)) as total_purchases
FROM my_table
group by cid) a where sum_mon == 78;
(Это далеко не элегантно — опять же, но, по крайней мере, это работает. Однако это не сработает для более общих случаев, т. Е. Если у нас есть 0 записей для каждого клиента в таблице, или если мы хотим выбрать клиентов, которые совершили 2 или более покупок в месяц. На данный момент мне это не нужно, но это может быть полезно для тех, кто сталкивается с подобной проблемой.)
Ответ №1:
Это можно сделать с помощью group by
и having
.
SELECT id
FROM my_table
GROUP BY id
HAVING SUM(CAST(num_purchases > 0 AS INT)) = 12
Используйте year
в group by
, если в таблице есть такой столбец.
Решение предполагает наличие одной строки на идентификатор в месяц и отсутствие пропущенных месяцев. Если это не так, измените запрос на основе показанной идеи
Комментарии:
1. Спасибо, что указали на недостающие месяцы и предложили решение. Я понимаю, что допустил ошибку в своем первоначальном запросе, и я забыл упомянуть, что действительно моя таблица не содержит все месяцы для клиента. Я соответствующим образом отредактировал свой пост и предложил обходной путь, основанный на вашем решении.