首页 > 解决方案 > 有什么简单的方法可以将多个 sql 简化为一个

问题描述

对不起,我不能用一句话来描述我在标题中的问题。
我有一个看起来像这样的表:

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_wants太多了,如果我做了上面的,那么sql文件就失控了。
如果有人可以提供帮助或提供一些建议,我将不胜感激,因为由于 sqls 的增加,我现在很头疼。

标签: hivehiveql

解决方案


你可以试试下面 -

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


推荐阅读