Hive 查询:根据优先级和日期计算最大指标值
Hive Query : To calculate max indicator value based on priority and date
我试图构建查询但不知何故没有得到所需的结果因此发布。我是蜂巢的新手。很抱歉,如果它很简单。
源数据:
Ik - priority - ind1 - ind2 - date
1 - A - y - n - 2009/01/01
1 - B - n - y - 2019/02/09
1 - C - null - (empty)- 2018/05/07
2 - A - null - y - 2005/02/02
2 - B - null - y - 2006/05/05
2 - C - n - null - 2018/01/01
问题陈述
根据优先级和日期,我们需要为每个 ik 填充指标值(ind1 和 ind2)。
输出table格式
Ik, ind1,ind2
逻辑是
这里Group by会在ik字段上完成。所以对于上面的数据集,在输出中将只有一条记录被填充。
如果对于相同的 ik 值,优先级为 A 且指示标志(ind1,ind2)为 y 值,则输出应填充为 "y"。
但如果 ik 相同,
优先级为 A,但指标没有值 "y"。
(可能的值为 null、n、空字符串)
然后将 select 基于日期字段的最新指标(按日期排序 - 最新记录按 ik 分组)从 B C 优先。
以上数据集的输出是
Ik - ind1 - ind2
1 - y - y
2 - n - y
这里的 ind1 是 max (ind1) 。我能够得出。但是无法导出ind2.
你能帮我创建查询吗?
with your_table as -------use your table instead of this subquery
(
select stack(6,
1 ,'A', 'y','n', '2009/01/01',
1 ,'B', 'n','y', '2019/02/09',
1 ,'C', null,'' , '2018/05/07',
2 ,'A', null,'y', '2005/02/02',
2 ,'B', null,'y', '2006/05/05',
2 ,'C', 'n', null, '2018/01/01'
) as (Ik, priority, ind1, ind2, date)
) -------use your table instead of this subquery
select ik,
max(case when priority ='A' and ind1='y' then 'y' else last_ind1 end) ind1,
max(case when priority ='A' and ind2='y' then 'y' else last_ind2 end) ind2
from
(
select Ik, priority, ind1, ind2, date,
last_value(ind1) over (partition by Ik order by date) last_ind1,
last_value(ind2) over (partition by Ik order by date) last_ind2
from your_table -------use your table instead
)s
group by ik;
结果:
ik ind1 ind2
1 y y
2 n y
我试图构建查询但不知何故没有得到所需的结果因此发布。我是蜂巢的新手。很抱歉,如果它很简单。
源数据:
Ik - priority - ind1 - ind2 - date
1 - A - y - n - 2009/01/01
1 - B - n - y - 2019/02/09
1 - C - null - (empty)- 2018/05/07
2 - A - null - y - 2005/02/02
2 - B - null - y - 2006/05/05
2 - C - n - null - 2018/01/01
问题陈述
根据优先级和日期,我们需要为每个 ik 填充指标值(ind1 和 ind2)。
输出table格式
Ik, ind1,ind2
逻辑是
这里Group by会在ik字段上完成。所以对于上面的数据集,在输出中将只有一条记录被填充。
如果对于相同的 ik 值,优先级为 A 且指示标志(ind1,ind2)为 y 值,则输出应填充为 "y"。
但如果 ik 相同, 优先级为 A,但指标没有值 "y"。 (可能的值为 null、n、空字符串)
然后将 select 基于日期字段的最新指标(按日期排序 - 最新记录按 ik 分组)从 B C 优先。
以上数据集的输出是
Ik - ind1 - ind2
1 - y - y
2 - n - y
这里的 ind1 是 max (ind1) 。我能够得出。但是无法导出ind2.
你能帮我创建查询吗?
with your_table as -------use your table instead of this subquery
(
select stack(6,
1 ,'A', 'y','n', '2009/01/01',
1 ,'B', 'n','y', '2019/02/09',
1 ,'C', null,'' , '2018/05/07',
2 ,'A', null,'y', '2005/02/02',
2 ,'B', null,'y', '2006/05/05',
2 ,'C', 'n', null, '2018/01/01'
) as (Ik, priority, ind1, ind2, date)
) -------use your table instead of this subquery
select ik,
max(case when priority ='A' and ind1='y' then 'y' else last_ind1 end) ind1,
max(case when priority ='A' and ind2='y' then 'y' else last_ind2 end) ind2
from
(
select Ik, priority, ind1, ind2, date,
last_value(ind1) over (partition by Ik order by date) last_ind1,
last_value(ind2) over (partition by Ik order by date) last_ind2
from your_table -------use your table instead
)s
group by ik;
结果:
ik ind1 ind2
1 y y
2 n y