Re: Join on virtual table - Mailing list pgsql-general

From Joe Conway
Subject Re: Join on virtual table
Date
Msg-id 41BA8590.2040201@joeconway.com
Whole thread Raw
In response to Join on virtual table  (Rory Campbell-Lange <rory@campbell-lange.net>)
List pgsql-general
Rory Campbell-Lange wrote:
> Hi. I'd like to return a result set from a plpgsql function constructed
> out of a 'virtual table' joined to an actual table, and struggling to
> find a sane approach.
>
> I have a table 'recs' with records like this.
>
>     day |  nums
>     -----------
>     2   |  1
>     5   |  3
>     2   |  2.5
>
> For a particular month in the year I would like to generate all the days
> in the month into a virtual table.
>
>     'virt'
>
>     vday
>     ---
>     1
>     ... omitted ...
>     30
>
> I would like a result set something like this:
>
>     day |  nums
>     -----------
>     1   |  0
>     2   |  3.5
>     3   |  0
>     4   |  0
>     5   |  3
>     6   |  0
>     ... etc.

You mean like this?

create table recs (day int, nums float);
insert into recs values(2,1);
insert into recs values(5,3);
insert into recs values(2,2.5);

CREATE OR REPLACE FUNCTION generate_series(int, int) RETURNS setof int AS '
  BEGIN
   FOR i IN $1..$2 LOOP
    RETURN NEXT i;
   END LOOP;
   RETURN;
  END;
' LANGUAGE plpgsql;

select f1, sum(coalesce(nums, 0))
from generate_series(1, 6) as t(f1) left join recs on f1 = day
group by f1;
  f1 | sum
----+-----
   1 |   0
   2 | 3.5
   3 |   0
   4 |   0
   5 |   3
   6 |   0
(6 rows)

BTW, as of 8.0.0, generate_series() is built in.

HTH,

Joe

pgsql-general by date:

Previous
From: "Marc G. Fournier"
Date:
Subject: Re: Mailing List Problems?
Next
From: "Marc G. Fournier"
Date:
Subject: Re: gborg.postgresql.org