我有一个包含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。
任何建议最早都会有所帮助。
由于
答案 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