Hive 查询:根据优先级和日期计算最大指标值

Posted

技术标签:

【中文标题】Hive 查询:根据优先级和日期计算最大指标值【英文标题】:Hive Query : To calculate max indicator value based on priority and date 【发布时间】:2019-03-26 17:45:11 【问题描述】:

我试图构建查询,但不知何故没有得到所需的结果,因此发布了。我是新来的蜂巢。如果它很简单,请道歉。

源数据:

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)。

输出表格格式

Ik, ind1,ind2

逻辑是

这里 Group by 将在 ik 字段上完成。因此,对于上述数据集,输出中只会填充一条记录。

如果对于相同的 ik 值,优先级为 A,指示标志(ind1,ind2)为 y 值,则输出应填充为“y”。

但是如果相同的 ik , 优先级是 A,但指标没有值“y”。 (可能的值为 null、n、空字符串)

然后将根据日期字段从 B C 优先级中选择最新的指标(按日期排序 - 按 ik 的最新记录组)。

上述数据集的输出是

Ik - ind1 - ind2
1 -    y     -   y
2 -    n    -   y

这里 ind1 是 max (ind1) 。我能够得出。但无法推导出ind2。

您能帮我创建查询吗?

【问题讨论】:

逻辑不清楚。请根据源数据中的列名在描述的逻辑中命名指标。你在计算哪一列,为什么它只有一行输出?请描述聚合。什么是Ik列 您好,先生,感谢您指出细节。我现在已经更新了问题陈述。谢谢 【参考方案1】:
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

【讨论】:

以上是关于Hive 查询:根据优先级和日期计算最大指标值的主要内容,如果未能解决你的问题,请参考以下文章

Linq 查询根据日期和优先级获取不同的对象

mysql怎样求每天指标1和2的最大值及时间?有日期,省名,市名,指标1,指标2。

从日期小于最大日期的 Hive 表中选择

根据商户id查询mysql最大日期和最小日期

查询中的 Hive DATE 操作

如何使用接受多列作为参数的java为hive编写UDAF?