有什么简单的方法可以将多个sql简化为一个

时间:2019-02-22 10:19:38

标签: hive hiveql

很抱歉,我不能用一个句子来描述我的题名。
我有一张看起来像这样的桌子:

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可以出现在许多日期中。
然后,我需要与所有多个attrs保持连接以获取想要的最终表,如下所示:

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_want太多,如果执行上述操作,则sql文件将失去控制。
如果有人可以提供帮助或提出建议,我将不胜感激,因为由于SQL的增加,我现在很头疼。

2 个答案:

答案 0 :(得分:0)

您应该阅读并将当前的SQL表示形式转换为Apache Hive中的WITH子句。这是ASF的页面-Common Table Expressions

在这里使用CTE非常有意义,因为您需要在同一个基表上工作,而最后一个操作本身涉及一个JOIN。

您还可以使用所需的分区功能运行所需的OVER子句,以模拟适合您的需求和分析的任何行为。

答案 1 :(得分:0)

您可以在下面尝试-

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函数将忽略空值。