如何获取蜂巢中最大计数组的ID?

时间:2018-06-06 17:59:43

标签: group-by hive max hiveql

我有一张这样的表:

id , m_id , group_id
 1 ,  a   ,    0 
 1 ,  b   ,    0 
 1 ,  c   ,    1 
 1 ,  d   ,    1 
 2 ,  e   ,    0 
 2 ,  f   ,    0 
 2 ,  g   ,    0
 2 ,  h   ,    1 
 2 ,  i   ,    1

对于每个id,我想获得他们属于最大数量为m_id的群组的m_id。如果有平局,我会随机选择m_id组。因此预期的输出将如下:

id , m_id 
 1 ,  a    
 1 ,  b    
 2 ,  e    
 2 ,  f    
 2 ,  g   

注意:group_id中的数字只是每个id下的群组识别指标。即group_id = 0并不代表id=1id=2之间的相同内容。

我最初的想法是获取max(group_id) group by (id,m_id),然后返回id,m_id的{​​{1}}。但是,这种方法对于平局情况(max(group_id个案例)没有帮助。

真的希望有人可以帮我这个!

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用row_number聚合来执行此操作。

select t1.id,t1.group_id,t1.m_id
from (select id,group_id,row_number() over(partition by id order by count(*) desc) as rnum
      from tbl
      group by id,group_id
     ) t
join tbl t1 on t1.id=t.id and t1.group_id=t.group_id
where t.rnum=1

答案 1 :(得分:1)

使用row_number()并按ID对组进行分区以获取最大分组。然后自我加入以获取每个id的最大分组,group_id

CREATE TABLE test 
(
  id integer , m_id char(1) , group_id integer
);
INSERT INTO test (id,m_id,group_id) VALUES (1,'a',0);
INSERT INTO test (id,m_id,group_id) VALUES (1,'b',0);
INSERT INTO test (id,m_id,group_id) VALUES (1,'c',1);
INSERT INTO test (id,m_id,group_id) VALUES (1,'d',1);
INSERT INTO test (id,m_id,group_id) VALUES (2,'e',0);
INSERT INTO test (id,m_id,group_id) VALUES (2,'f',0);
INSERT INTO test (id,m_id,group_id) VALUES (2,'g',0);
INSERT INTO test (id,m_id,group_id) VALUES (2,'h',1);
INSERT INTO test (id,m_id,group_id) VALUES (2,'i',1);

select b.id,b.group_id,b.m_id
from (
         select id,group_id,row_number() over(partition by id order by id,group_id,count(*) desc) as r_no
         from test
         group by id,group_id
     ) a
join test b on b.id=a.id and b.group_id=a.group_id
where a.r_no=1

<强>输出

enter image description here