sexta-feira, 17 de agosto de 2012

Como criar uma tabela cruzada no Postgresql

 Uma função que ajudou bastante na construção de tabelas para serem apresentadas no site foi a "crosstab" do Postgresql, que deve ser utilizada da seguinte maneira:


create table estatisticas.br_ano_mes as (
select *
from crosstab('select extract(year from data_pas)::text , extract(month from data_pas)::text, count(gid)::text from focos_referencia
        where pais = ''Brasil''
        group by 1,2
        order by 1,2', 'select m from generate_series(1,12) m')

as ct(ano text, jan text, fev text, mar text, abr text,
mai text, jun text, jul text, ago text, set text, out text, nov text,
dez text));


e o resultado é similar a isto:

ANO Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro
1998 0 0 0 0 0 3.551 8.067 35.551 41.974 23.498 6.804 4.449
1999 1.081 1.284 667 717 1.812 3.632 8.758 39.487 36.914 27.014 8.861 4.376
2000 778 562 849 538 2.097 6.275 4.740 22.204 23.293 27.337 8.399 4.465
2001 547 1.059 1.268 1.081 2.090 8.433 6.490 31.887 39.834 31.038 15.639 6.201
2002 1.654 1.570 1.679 1.682 3.818 10.839 10.769 47.266 61.012 52.073 30.356 11.649
2003 3.603 2.353 3.181 1.902 3.871 10.549 19.391 27.666 57.249 43.058 23.010 15.061
2004 2.330 1.210 1.523 1.057 4.339 13.655 17.960 37.354 66.970 39.161 29.557 17.505
2005 4.047 1.349 1.444 1.211 3.027 4.594 13.988 52.504 63.932 48.879 25.589 5.046
2006 1.885 1.350 902 841 1.765 3.137 6.947 25.682 37.144 16.833 12.805 8.024
2007 1.513 1.179 2.289 850 2.184 4.891 7.031 64.431 94.526 32.312 13.095 4.075
2008 2.125 1.275 1.239 1.253 553 1.287 4.507 14.528 39.445 39.264 12.778 4.995
2009 2.848 1.140 1.392 1.078 2.593 2.962 6.599 17.559 29.430 24.202 23.914 9.494
2010 2.851 2.386 2.417 2.200 3.497 3.642 16.646 75.305 85.415 31.489 16.587 6.856
2011 1.416 973 937 1.152 1.985 4.578 8.524 22.477 50.302 18.691 12.222 9.830

quarta-feira, 8 de agosto de 2012

Manipulação de datas em Linux

Para fazer conversão de dia juliano (dia do ano 0-365) para o formato gregoriano (dd-mm-aaaa) deve ser utilizada a seguinte linha de comando:

yyyymmdd=$(date -d "${yyyy}-01-01 + ${ddd} days -1 day" +%Y%m%d)

onde as variáveis yyyy representam o ano de interesse e ddd representa o dia sequencial como por exemplo 221

cdsr@dallas:~/scripts$ yyyymmdd=$(date -d "2012-01-01 + 221 days -1 day" +%Y%m%d)
cdsr@dallas:~/scripts$ echo $yyyymmdd
20120808

Por outro lado converter de dia juliano para dia-mes-ano é mais simples, bastando para isto utilizar o seguinte comando:

date -d 2012-08-08 +%j