Как получить идентификатор группы максимального количества в улье? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть такая таблица:

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, который имеет max(group_id).Тем не менее, этот подход не поможет в ситуации связывания (id = 2 случаев).

Действительно надеюсь, что кто-то может помочь мне в этом!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Используйте row_number () и разделите группу по идентификатору, чтобы получить максимальную группировку. При самостоятельном объединении получите максимальную группировку для каждого идентификатора, 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

0 голосов
/ 06 июня 2018

Для этого можно использовать 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
...