很抱歉,我不能用一个句子来描述我的题名。
我有一张看起来像这样的桌子:
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的增加,我现在很头疼。
答案 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函数将忽略空值。