Thread: query or design question

query or design question

From
Adam Witney
Date:
Hi,

I have a table like so

CREATE TABLE imagene (
id             int
bioassay_id    int
gene_id        text
s_row          int
s_column       int
s_meta_row     int
s_meta_column  int
sig_median     numeric
bkg_median     numeric
);

Rows are unique on (bioassay_id, gene_id, s_row, s_column, s_meta_row,
s_meta_column)

They are grouped like this (note, the counts will not always be the same)

cabbage=# select bioassay_id, count(*) from imagene group by bioassay_id;bioassay_id | count
-------------+-------        106 | 10944        107 | 10944


And I need to generate an output like this......
            bioassay_id=106        bioassay_id=107        ----------------------  ----------------------
gene_id, sig_median, bkg_median, sig_median, bkg_median



I can do something like this

SELECT a.gene_id,        a.sig_median, a.bkg_median,        b.sig_median, b.bkg_median  FROM       imagene a,
imageneb  WHERE       a.s_meta_row = b.s_meta_row AND      a.s_meta_col = b.s_meta_col AND      a.s_row = b.s_row AND
  a.s_column = b.s_column AND      a.bioassay_id = 106 AND      b.bioassay_id = 107;
 


But this is quite slow... And not generic as I may need to generate the
output for more than two bioassay_ids. Also I may need to do an outer join
to make sure I get all rows from both data sets?

I am not sure if a crosstab function will do this?

Any ideas of pointers would be greatly appreciated

Thanks

Adam


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.



Re: query or design question

From
Richard Huxton
Date:
On Monday 20 October 2003 11:58, Adam Witney wrote:
> Hi,
>
> I have a table like so
>
> CREATE TABLE imagene (
> id             int
> bioassay_id    int
> gene_id        text
> s_row          int
> s_column       int
> s_meta_row     int
> s_meta_column  int
> sig_median     numeric
> bkg_median     numeric
> );

> And I need to generate an output like this......
>
>              bioassay_id=106        bioassay_id=107
>          ----------------------  ----------------------
> gene_id, sig_median, bkg_median, sig_median, bkg_median


> I am not sure if a crosstab function will do this?

There are some examples in contrib/tablefunc that might well be useful for 
you. You should also check out the "Set Returning Functions" article on 
http://techdocs.postgresql.org/

If you find your requirements getting particularly complex, I'd be tempted to 
do the hard work in the application.

--  Richard Huxton Archonet Ltd