hive - 有什么简单的方法可以将多个 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 的增加,我现在很头疼。
解决方案
你可以试试下面 -
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 函数空值将被忽略。
推荐阅读
- android - 如何从我单击的位置获取每个 UID
- kotlin - Kotlin + Gson - 如何在数据类为空时获取空列表
- ionic-framework - 如何使用localstorage使用Ionic3更改离子列表中的按下项目背景颜色
- ios - Cordova 内容安全策略适用于 Android,但在 ios 上失败
- sql - Json 对到行
- java - 使用 spring-data-dynamodb 自定义 DynamoDBMapper
- azure - Azure 数据工厂选择属性“状态”:来自先前活动的“成功”
- angular - 等待继续 - Angular 6
- sql - 在 JSON 列中查找 Array 的长度
- java - 在树中设置父节点