can i make this sql query more efficiant?

From: Robert Treat <xzilla(at)users(dot)sourceforge(dot)net>
To: pgsql-sql(at)postgresql(dot)org
Subject: can i make this sql query more efficiant?
Date: 2003-04-03 21:02:04
Message-ID: 1049403724.13799.5473.camel@camel
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance pgsql-sql


create table baz (event text, level int);

insert into baz values ('x',1);
insert into baz values ('x',2);
insert into baz values ('x',3);
insert into baz values ('y',2);
insert into baz values ('y',3);
insert into baz values ('y',3);

select * from baz;

event | level
-------+-------
x | 1
x | 2
x | 3
y | 2
y | 3
y | 3
(6 rows)

I want to know how many ones, twos, and threes there are for each event:

select
event,
(select count(*) from baz a
where level = 1 and a.event=baz.event) as ones,
(select count(*) from baz a
where level = 2 and a.event=baz.event) as twos,
(select count(*) from baz a
where level = 3 and a.event=baz.event) as threes
from
baz
group by
event;

which gives me:

event | ones | twos | threes
-------+------+------+--------
x | 1 | 1 | 1
y | 0 | 1 | 2
(2 rows)

which is fine, but I am wondering if there is a better way to do this?
I'd mainly like to reduce the number of subqueries involved. Another
improvement would be to not have to explicitly query for each level,
though this isn't as big since I know the range of levels in advance
(famous last words for a dba :-)

Thanks in advance,

Robert Treat

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Will LaShell 2003-04-03 22:04:19 Re: ext3 filesystem / linux 7.3
Previous Message Bruno Wolff III 2003-04-03 21:01:47 Re: [PERFORM] [HACKERS] OSS database needed for testing

Browse pgsql-sql by date

  From Date Subject
Next Message Dan Langille 2003-04-03 21:07:07 Re: PowerBuilder and identity column
Previous Message Stefan 2003-04-03 20:48:06 PowerBuilder and identity column