我有一张这样的表:
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=1
和id=2
之间的相同内容。
我最初的想法是获取max(group_id) group by (id,m_id)
,然后返回id,m_id
的{{1}}。但是,这种方法对于平局情况(max(group_id
个案例)没有帮助。
真的希望有人可以帮我这个!
谢谢!
答案 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
<强>输出强>