基于多个列进行分组并在Hive中查找每个组中的最大值

时间:2018-01-03 13:58:24

标签: group-by hive max

我有一个包含3列的hive表hive_tab:

+---------------------+
|   date   |id | desc |
+---------------------+
|2017-05-31|100| high |
|2017-05-30|202| high |
|2017-05-31|102|medium|
|2017-05-31|102|medium|
|2017-05-31|102|  low |
|2017-05-31|101|  low |
|2017-05-30|201|medium|
|2017-05-31|100| high |
|2017-05-31|100|  low |
|2017-05-31|100| high |
|2017-05-30|200|  low |
|2017-05-30|201|medium|
|2017-05-30|201|medium|
|2017-05-30|202| high |
|2017-05-30|201| high |
|2017-05-30|201|  low |
|2017-05-30|201|  low |
|2017-05-30|202|medium|
+---------------------+

预期输出为:

+----------------------------------+
|   date   |id | desc | count_desc |
+----------------------------------+
|2017-05-31|100| high |     3      |
|2017-05-31|101|  low |     1      |
|2017-05-31|102|medium|     2      |
|2017-05-30|200|  low |     1      |
|2017-05-30|201|medium|     3      |
|2017-05-30|202| high |     2      |
+----------------------------------+

数据是: 每天(日期)可以有任意数量的ID。每个ID都有任意数量的desc为高,中,低。

我们希望每个id每天最常出现的desc如预期输出中所述。

已经尝试过以下查询:

select A.date,A.id,A.desc,max(c)
from(
select date,id,desc,count(desc) c
from hive_tab group by date,id,desc)A
group by id,c,date,desc;

但是输出并不像预期的那样。它每个id每天都会给出所有desc,而不是每个id每天只出现最常出现的desc。

任何建议最早都会有所帮助。

由于

1 个答案:

答案 0 :(得分:1)

从group by子句中删除desc,因为你想要每组日期和id的最大值。

select A.date,A.id,max(c)
from
(
   select date,id,desc,count(desc) c
   from hive_tab 
   group by date,id,desc
) A
group by A.date,A.id;

使用row_number()和分区

select * from 
(
   select 
        date,
        id,
        desc,
        max(desc) over (partition by date,id,desc) as max_desc,
        row_number() over (partition by date,id,desc order by max_desc desc) as row_no
   from hive_tab
) res 
where res.row_no = 1