Есть ли простой способ, которым я могу упростить несколько sqls в один - PullRequest
0 голосов
/ 22 февраля 2019

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

item_id,
attr_1,
attr_2,
attr_3,
...,
attr_n,
date

Что бы я хотел добиться внешностивот так:

select
   attr_1, 
   avg(attr_2) i_want_1
from 
   table
where date between some_range
group by attr_1

select
   attr_1,
   attr_2, 
   avg(attr_3) i_want_2
from 
   table
where date between some_range
group by attr_1, attr_2

select
   attr_5,
   attr_6, 
   avg(attr_7) i_want_3
from 
   table
where date between some_range
group by attr_5, attr_6

PS: item_id может появляться во многих датах.
Затем мне нужно по левому краю соединяться с каждым множеством атрибутов, чтобы получить финальную таблицу, которую я хочу, выглядит так:

item_id,
i_want_1,
i_want_2,
i_want_3,
....

Если я делаю все вышеперечисленное в одну дату, это легко достигается с помощью функции over, например:

select 
    item_id, 
    avg(attr_2) over(partition by attr_1) i_want_1,
    avg(attr_3) over(partition by attr_1, attr_2) i_want_2,
    avg(attr_7) over(partition by attr_5, attr_6) i_want_3
from 
    table
where date = single_date

Есть ли способ использовать функцию, подобную overдля достижения окончательного результата в одном sql?
Или есть какой-нибудь простой способ решить проблему, подобную этой?
У меня слишком много i_wants, и если я сделал выше, то файл sql вышел из-под контроля.
Буду признателен, если кто-нибудь сможет помочь или дать какой-нибудь совет, потому что у меня сейчас болит голова из-за увеличения sqls.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Можете ли вы попробовать ниже -

select distinct
    item_id, 
    avg(case when date between somerange then null else attr_2 end) over(partition by attr_1) i_want_1,
    avg(case when date between somerange then null else attr_3 end) over(partition by attr_1, attr_2) i_want_2,
    avg(case when date between somerange then null else attr_7 end) over(partition by attr_5, attr_6) i_want_3
from 
    table;

Так как вам нужно среднее значение, основанное на фильтре для каждой функции avg, нулевые значения будут игнорироваться.

0 голосов
/ 22 февраля 2019

Вы должны прочитать и преобразовать свое текущее представление SQL в предложение WITH в Apache Hive.Вот страница из ASF - Распространенные табличные выражения

Использование CTE имеет здесь большой смысл, так как вам нужно работать с той же базовой таблицей, а последняя операция включает в себя JOIN.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...