PostgreSQL: selecciona los tres primeros en cada grupo

siguiente es mi tabla de muestra y filas

create table com (company text,val int); insert into com values ('com1',1),('com1',2),('com1',3),('com1',4),('com1',5); insert into com values ('com2',11),('com2',22),('com2',33),('com2',44),('com2',55); insert into com values ('com3',111),('com3',222),('com3',333),('com3',444),('com3',555); 

Quiero get el valor 3 superior de cada empresa, el resultado esperado es:

 company val --------------- com1 5 com1 4 com1 3 com2 55 com2 44 com2 33 com3 555 com3 444 com3 333 

Prueba esto:

 SELECT company, val FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY company order by val DESC) AS Row_ID FROM com ) AS A WHERE Row_ID < 4 ORDER BY company 

– Demostración rápida aquí …

Desde v9.3 puedes hacer una unión lateral

 select distinct com_outer.company, com_top.val from com com_outer join lateral ( select * from com com_inner where com_inner.company = com_outer.company order by com_inner.val desc limit 3 ) com_top on true order by com_outer.company; 

Puede ser más rápido , pero, por supuesto, debe probar el performance específicamente en sus datos y caso de uso.