Условный выбор записей за месяц в улье

#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. Спасибо, что указали на недостающие месяцы и предложили решение. Я понимаю, что допустил ошибку в своем первоначальном запросе, и я забыл упомянуть, что действительно моя таблица не содержит все месяцы для клиента. Я соответствующим образом отредактировал свой пост и предложил обходной путь, основанный на вашем решении.