2017-03-02 50 views
1

我有这样的数据:如何按一列分组,每组取最大值,并保留其他组的信息?

column1 column2 column3 
A   V   10 
A   Z   11 
A   X   11 

而对于我想找到column3最大值和column2相应值column1每个数据。我如何在HIVE中做到这一点?

我最接近的就是做select column1, max(column3) from table group by column1。但是,这并没有添加来自column2的相应信息。我怎样才能得到这个呢?

在第3栏中的配合,我真的不在乎我们从column2拉什么值。谢谢。

我想要得到的结果是:

column1 column2 column3 
A   Z   11 

回答

1

一种方法做将使用row_number它。在绑定的情况下,您将获得column2的任意值。

select column1,column2,column3 
from (
select t.*,row_number() over(partition by column1 order by column3 desc) as rn 
from tablename t 
) x 
where rn=1 
+0

HM。真的没有更优雅/更短的解决方案吗?我是在想。 – simple

+0

row_number的第二个解决方案很好,第一个解决方案 - 不是。 –

+0

@DuduMarkovitz ..当我写第一个查询时,我正在过度思考..我删除它,因为它可能不适用于Hive。 –

0

以下是同样的概念


select  column1   , 
      ,max(named_struct('column3',column3,'column2',column2)).column2 
      ,max(column3) as column3 

from  mytable 

group by column1 
; 

+---------+---------+---------+ 
| column1 | column2 | column3 | 
+---------+---------+---------+ 
| A  | Z  |  11 | 
+---------+---------+---------+ 

select  column1 
      ,max(struct(column3,column2)).col2 as column2 
      ,max(column3)      as column3 

from  mytable 

group by column1 
; 

的一些变化
+---------+---------+---------+ 
| column1 | column2 | column3 | 
+---------+---------+---------+ 
| A  | Z  |  11 | 
+---------+---------+---------+ 

select  column1 
      ,col.column2 
      ,col.column3 

from  (select  column1 
         ,max(named_struct('column3',column3,'column2',column2)) as col 

      from  mytable 

      group by column1 
      ) t 
; 

+---------+---------+---------+ 
| column1 | column2 | column3 | 
+---------+---------+---------+ 
| A  | Z  |  11 | 
+---------+---------+---------+ 
相关问题