Условный SELECT по записям за месяц в Hive - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть таблица, содержащая данные за год с количеством покупок в месяц на одного клиента. Это выглядит так:

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):

Я понимаю, насколько нелепым является приведенный выше запрос - он никогда не будет ничего возвращать, если я не преобразую таблицу и не помещу все записи от одного клиента в одну строку: /.

После ответа Вамси я понял, что не упомянул, что моя таблица не содержит записей с 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 Ответ

1 голос
/ 03 апреля 2019

Это можно сделать с group by и having.

SELECT id
FROM my_table
GROUP BY id
HAVING SUM(CAST(num_purchases > 0 AS INT)) = 12

Используйте year в group by, если в таблице есть такой столбец.

Решение предполагает, что для каждого идентификатора в месяц существует одна строка, и пропущенных месяцев нет. Если это не так, измените запрос, основываясь на показанной идее

...