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.