Paginação para grupos no postgres

Posted About 6 years ago. Visible to the public.

O Postgres trata um groupby como sendo uma tabela, ou seja, não há como utilizar limit ou offset para cada grupo resultante do groupby.

A alternativa encontrada no blog Show archive.org snapshot . A solução utiliza windows functions do postgres.

Primeiro criamos os grupos com partition, depois enumeramos as linhas de cada grupo com row_number(), por fim, utilizamos o where row_number > :offset_param and row_number < :limit_param.

Exemplo:

Este exemplo irá listar 10 linhas de resultado do join entre tabela A e B caso offset_param e limit_param sejam substituídos por 1 e 10 respectivamente.

SELECT *
FROM (SELECT
		  b.id                                    AS tabela_b_id,
		  row_number()
		  OVER (
			  PARTITION BY b.id
			  ORDER BY a.fk_b DESC )          AS linha_no_grupo,
		  a.*
	  FROM tabela_a a
		  JOIN tabela_b b ON a.fk_b = b.id) grupos
where grupos.linha_no_grupo >= :offset_param and grupos.linha_no_grupo <= :limit_param;

Observação: Deve lembrar que o limit_param não é igual o limit, pois deve ser calculado, limit_param = offset_param + limit

Alexdev
Last edit
About 6 years ago
Alexdev
Keywords
sql
Posted by Alexdev to ZeroGlosa (2018-03-05 12:48)