Publicação

Criando séries ou intervalos de dados com PostgreSQL

foto de
Phillip Parente CONTEÚDO EM DESTAQUE

Em muitas ocasiões, para gerar séries e sequências de dados para a utilização em gráficos ou análises em geral, nos deparamos com a necessidade de usar ferramentas como o excel ou editores avançados de texto para a criação sequencial de valores. Desta forma, teríamos que extrair as informações da base e inseri-las em uma destas ferramentas para, então, trabalhá-las. Contudo, por que não gerá-las diretamente do banco de dados? Muitos #Bancos de Dados contemplam a criação de séries e aqui veremos como facilmente utilizar recursos nativos do #PostgreSQL, como o generate_series, para elaborar listas de valores.

Séries ou sequências de números

Pra elaborar listas de números utilizamos a sintaxe generate_series(start, stop, step), como por exemplo, para gerar uma simples lista de 1 a 5:

select generate_series(1 /* início */, 10 /* fim */, 1/* valor de incremento */);
1
2
3
4
5

... ou números pares de 1 a 10:

select generate_series(2 /* início */, 10 /* fim */, 2/* valor de incremento */);
2
4
6
8
10

... ou fracionado que difere um pouco, mas também é muito simples com o operador "*":

select generate_series(1,3) * 0.5 /*incremento*/;
0.5
1.0
1.5

Séries ou sequências de letras

Para elaborar listas de letras, utilizaremos o código inteiro correspondente à letra A maiúsculo , 65, o correspondente à letra Z maiúsculo, 90, e a função para retornar o caractere a partir do código, char(integer). Então temos:

select chr(generate_series(65,90));
A
B
C
...
Z

... ou, quem sabe, gerar uma senha aleatória de 8 caracteres usando também a função random(), array_agg(array) e array_to_string(array):

select array_to_string(array_agg(password_char), '') from (select generate_series(1, 8), chr((random()*58+64)::integer) password_char) password_generator;
dpPrU@^r

Séries ou sequências de datas

Para listas de datas, como por exemplo gerar o intervalo entre 01/01/2016 e 05/01/2016 utilizando o intervalo de 1 dia, temos:

select generate_series ( '2016-01-01'::timestamp, '2016-01-05'::timestamp, '1 day'::interval);
2016-01-01 00:00:00
2016-01-02 00:00:00
2016-01-03 00:00:00
2016-01-04 00:00:00
2016-01-05 00:00:00

... ou o primeiro dia de cada mês do ano de 2016:

select generate_series ( '2016-01-01'::timestamp, '2016-12-01'::timestamp, '1 month'::interval);
2016-01-01 00:00:00
...
2016-12-01 00:00:00

 ... ou o último:

select (date_trunc('month', generate_series ( '2016-01-01'::timestamp, '2016-12-01'::timestamp, '1 month'::interval)) + interval '1 month' - interval '1 day')::date;

Vimos a poderosa ferramenta de elaboração de séries ou sequências do PostgreSQL. Diversas outras coleções podem ser efetuadas para ajudar quem lida diariamente com informação e necessita de listagens bem trabalhadas de recursos, até mesmo com junções à tabelas presentes na base de dados. Alguma dúvida? Deixe nos comentários.

Comentários