2017-02-17 20 views
0

У меня есть огромный код пункта улей запрос, как это показано ниже:Как оптимизировать запрос куста с несколькими счетчиками (отчетливо ...) в периоды перекрытия?

select 
count(distinct case when click_day between ${hiveconf:dt_180} and ${hiveconf:dt_end} and recommend_flag=1 then productid else null end) as unique_hk_products_cnt_180d, 
count(distinct case when click_day between ${hiveconf:dt_90} and ${hiveconf:dt_end} and recommend_flag=1 then productid else null end) as unique_hk_products_cnt_90d, 
count(distinct case when click_day between ${hiveconf:dt_30} and ${hiveconf:dt_end} and recommend_flag=1 then productid else null end) as unique_hk_products_cnt_30d, 
count(distinct case when click_day between ${hiveconf:dt_15} and ${hiveconf:dt_end} and recommend_flag=1 then productid else null end) as unique_hk_products_cnt_15d, 
count(distinct case when click_day between ${hiveconf:dt_7} and ${hiveconf:dt_end} and recommend_flag=1 then productid else null end) as unique_hk_products_cnt_7d 
from mytable ; 

единственное различие между этими полями является количество дней, которое представляет собой длину временного окна. Это делает мой запрос очень большим, и трудно ошибиться.

dt_15 просто переменная строка определена до:

set dt_15 = CONCAT(SUBSTRING(date_sub(current_date,15), 1, 4), SUBSTRING(date_sub(current_date,15), 6, 2), SUBSTRING(date_sub(current_date,15), 9, 2)); 

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

Спасибо.

ответ

0

Попробуйте

select count (case when click_day between ${hiveconf:dt_180} and ${hiveconf:dt_end} then productid end) as unique_hk_products_cnt_180d 
     ,count (case when click_day between ${hiveconf:dt_90} and ${hiveconf:dt_end} then productid end) as unique_hk_products_cnt_90d 
     ,count (case when click_day between ${hiveconf:dt_30} and ${hiveconf:dt_end} then productid end) as unique_hk_products_cnt_30d 
     ,count (case when click_day between ${hiveconf:dt_15} and ${hiveconf:dt_end} then productid end) as unique_hk_products_cnt_15d 
     ,count (case when click_day between ${hiveconf:dt_7} and ${hiveconf:dt_end} then productid end) as unique_hk_products_cnt_7d 

from (select click_day,recommend_flag,productid 
       ,row_number() over 
       (
        partition by productid 
        order by  click_day desc  
       ) as rn 

     from mytable 

     where click_day between ${hiveconf:dt_180} and ${hiveconf:dt_end} 
      and recommend_flag=1 
     ) t 

where rn = 1 

P.S.
По каким-либо причинам вы сохраняете свои даты в нестандартной форме?

+0

Исходные поля должны быть изменены. то есть результат должен быть горизонтальной таблицей. – yanachen

+0

Он все тот же –

0

Попробуйте это: использовать встроенные в дата функция

set dt_15 = from_unixtime(unix_timestamp(date_sub(current_date,15),'yyyy-mm-dd'),'yyyymmdd') 

для установки значения, так как это приведет к удалению CONCAT и операции подстроки.

select 
count(case when click_day between ${hiveconf:dt_180} and ${hiveconf:dt_end} then productid else null end) as unique_hk_products_cnt_180d, 
count(case when click_day between ${hiveconf:dt_90} and ${hiveconf:dt_end} then productid else null end) as unique_hk_products_cnt_90d, 
count(case when click_day between ${hiveconf:dt_30} and ${hiveconf:dt_end} then productid else null end) as unique_hk_products_cnt_30d, 
count(case when click_day between ${hiveconf:dt_15} and ${hiveconf:dt_end} then productid else null end) as unique_hk_products_cnt_15d, 
count(case when click_day between ${hiveconf:dt_7} and ${hiveconf:dt_end} then productid else null end) as unique_hk_products_cnt_7d 
from (select distinct click_day,productid where recommend_flag = 1) tmp ; 

Это уменьшит входной объем. Вы также можете поместить click_day < dt_end, если он одинаковый для всего столбца и удалить между ними.

+0

У него нет той же логики, что и исходное сообщение. Удаление дубликатов productid за клик_день (если таковые имеются) не мешает подсчитать дубликат productid для ряда дат. –

 Смежные вопросы

  • Нет связанных вопросов^_^