Re: transposed query?

From: Joe Conway <mail(at)joeconway(dot)com>
To: Nick Barr <nicky(at)chuckie(dot)co(dot)uk>
Cc: pgsql-general(at)postgresql(dot)org, javier garcia - CEBAS <rn001(at)cebas(dot)csic(dot)es>
Subject: Re: transposed query?
Date: 2003-11-04 02:11:05
Message-ID: 3FA70AB9.4020303@joeconway.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Nick Barr wrote:
>>> called "cross references querys" but I can't find my way in Postgres.
>>>
>>> My table 'muestras_rambla' is like:
>>> date | id_punto | muestra | flow | n_nitrato ...
>>> --------------------------+----------+---------+---------+-----------
>>> 06/02/2003 00:00:00 CET | 1 | 1 | 699.462 | 18.44
>>> 06/02/2003 00:00:00 CET | 1 | 2 | 699.462 | 13.79
>>> 06/02/2003 00:00:00 CET | 2 | 1 | 341.05 | 11.15
>>> 06/02/2003 00:00:00 CET | 2 | 2 | 341.05 | 17.3
>>> 06/02/2003 00:00:00 CET | 3 | 1 | 514.05 | 22.17
>>> 06/02/2003 00:00:00 CET | 3 | 2 | 514.05 | 16.62
>>> 06/02/2003 00:00:00 CET | 4 | 1 | 466.884 | 18.99
>>> 06/02/2003 00:00:00 CET | 4 | 2 | 466.884 | 19.02
>>> 06/02/2003 00:00:00 CET | 6 | 1 | 30.012 | 5.91
>>> 06/02/2003 00:00:00 CET | 6 | 2 | 30.012 | 4.15
>>> 19/02/2003 00:00:00 CET | 1 | 1 | 911.43 | 17.66
>>> 19/02/2003 00:00:00 CET | 1 | 2 | 911.43 | 9.23
>>> ...
>>>
>>> where I 'id_punto' can take the values from 1 to 6, and muestra is 1
>>> or 2. Commonly, for each 'date' and 'id_punto' we have two samples
>>> (muestra), and the 'flow' is also commonly the same for the two samples.
>>>
>>> The case is that for every 'date' I want to have the 'time series' of
>>> flows in the way:
>>> date 1 2 3 4 6
>>> 03/10/2002 606.92 323.08 440.69 393.61 5.49
>>> 17/10/2002 348.19 400.32 319.33 211.26 2.53

See the crosstab function in contrib/tablefunc. Here's what is looks
like given the above data:

select * from crosstab(
'select thedate, id_punto, avg(flow) from muestras_rambla
group by thedate, id_punto order by 1,2',
'select distinct id_punto from muestras_rambla
order by 1'
) as (thedate timestamp with time zone,
c1 float8, c2 float8, c3 float8, c4 float8, c6 float8);

thedate | c1 | c2 | c3 | c4 | c6
------------------------+---------+--------+--------+---------+--------
2003-02-05 15:00:00-08 | 699.462 | 341.05 | 514.05 | 466.884 | 30.012
2003-02-18 15:00:00-08 | 911.43 | | | |
(2 rows)

This form of crosstab() requires 7.4RC1 or a 7.3 backpatched copy from here:
http://www.joeconway.com/

HTH,

Joe

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Joe Conway 2003-11-04 05:40:45 Re: plpgsql question
Previous Message Karsten Hilbert 2003-11-03 23:57:54 Re: Internet based database