Eu tenho uma grande tabela (~ 9 milhões de linhas) e quero agrupar as linhas em um campo contendo o ano. Até aqui é bem fácil:
// greatly simplified:
SELECT count(*), year FROM dataset GROUP BY year ORDER BY 2;
Definimos alguns períodos de tempo irregulares abrangendo vários anos:
<1945, 1946-1964, 1965-1974, 1975-1991, 1992-2005 and >2005
Não tenho ideia de como agrupar esses resultados na cláusula group by. Eu poderia fazer subconsultas para cada período de tempo.
SELECT
( SELECT count(*) FROM dataset WHERE year <= 1945 AND ...... ) AS pre1945,
( ....) AS period2,
....
FROM dataset
Mas isso não parece certo e estou me perguntando se seria possível deixar o Postgresql fazer isso. Especialmente porque a consulta é uma forte simplificação da consulta real: ela possui várias condições, entre elas uma cláusula ST_within abrangendo quatro tabelas. Portanto, escolher a abordagem de subconsulta resulta em uma consulta inchada.
Existe uma maneira melhor de criar esse resultado?
Use a contagem condicional:
Isso funciona porque
count()
ignora valores nulos e acase
instrução retornanull
valores for fora do intervalo para o qual testa (anelse null
está implícito).Com a próxima versão 9.4, você pode reescrever isso como
Se você deseja o resultado como linhas em vez de colunas como na resposta de @a_horse, crie os intervalos de anos em um CTE e junte a tabela a ele
http://www.postgresql.org/docs/current/static/rangetypes.html