Как получить данные за последний месяц из таблицы, основанной на текущем месяце и году?

#sql #hive #hiveql

#sql #улей #hiveql

Вопрос:

Я столкнулся с некоторой проблемой с кодом hive. Мой FROM TABLE разделен на основе месяца, года и дня. Я придумал следующий код, чтобы получить нужные мне данные. Логика примерно такая: если текущее значение mth равно 01 , то измените month значение на 12, а год на yr - 1 , иначе измените месяц на mth - 1 и оставьте год как есть.

 set hivevar:yr=2019;
set hivevar:mth=03;
set hivevar:dy=29;

SELECT * from 
FROM table
WHERE 
month = case when cast('${mth}' as int) = 01 then 12 else cast((cast('${mth}' as int) - 1) as string) end
AND year = case when cast('${mth}' as int) = 01 then cast((cast('${yr}' as int) - 1) as string) else '${yr}' end;
  

Это не работает, my select * приходит пустым. Пожалуйста, помогите.

desc table
таблица

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

1. можете ли вы описать на английском языке, что вы пытаетесь получить из таблицы с заданной датой?

2. @VamsiPrabhala Я хочу получить данные за последний месяц на основе текущего месяца и года. например, если месяц 03 (2019), мне нужны данные за 02 (2019). Если текущий месяц равен 01 (2019), то мне нужны данные за 12 (2018).

3. есть ли в таблице столбец даты или это только месяц, год и дата в виде отдельных столбцов?

4. Можете ли вы предоставить свою структуру таблицы? Если вы измените ‘$ {mth}’, скажем, на 05, и ‘$ {yr}’ на 2019, ваш запрос сработает?

5. @VamsiPrabhala нет. Она разбита на разделы в зависимости от месяца, года и дня.

Ответ №1:

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

 select *
from table 
where concat_ws('-',year,month,day) >= add_months(date_add(concat_ws('-','${yr}','${mth}','${dy}'),1-'${dy}'), -1) 
and concat_ws('-',year,month,day) < date_add(concat_ws('-','${yr}','${mth}','${dy}'),1-'${dy}') 
  

Решение предполагает, что год, месяц и день имеют формат гггг, ММ и дд. Если нет, скорректируйте их по мере необходимости

Кроме того, вам следует рассмотреть возможность сохранения date в виде столбца, даже если он разделен по годам, месяцам и дням.

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

1. Использование разделов может помочь запросу выполняться быстрее, вот почему я не был склонен использовать встроенные функции. И я не могу использовать DDL таблиц prod. :'( Я пытался придумать что-нибудь еще, чтобы сделать то же самое.

2. Я знаю .. вот почему я сказал в дополнение к разделенным столбцам