| From: | Vitaly Belman <vitalib(at)012(dot)net(dot)il> |
|---|---|
| To: | pgsql-performance(at)postgresql(dot)org |
| Subject: | Additional select fields in a GROUP BY |
| Date: | 2004-06-13 03:21:17 |
| Message-ID: | 2393942843.20040613062117@012.net.il |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-performance |
Hello,
Consider the following query:
select t1field1, avg(t2fieild2)
from t1, t2
where t1.field1 = t2.field2
group by t1field1
That works fine. But I'd really like to see more fields of t1 in this
query, however I can't add them into the select because they're not
part of the GROUP BY, thus I have to add them to there too:
select t1field1, t1field2, t1field3, avg(t2fieild2)
from t1, t2
where t1.field1 = t2.field2
group by t1field1, t1field2, t1field3
The problem is that addind them all to GROUP BY causes a performance
loss.. The only solution I found is using a subquery like this:
select * from
t1, (select t1field1, avg(t2fieild2)
from t1, t2
where t1.field1 = t2.field2
group by t1field1) t1inner
where t1.field1 = t1inner.field1
It works just fine.. But I prefer not to use subqueries unless I am
really forced to due to the design of my application.
Another solution I considered is using aggreate function like that:
select t1field1, max(t1field2), max(t1field3), avg(t2fieild2)
from t1, t2
where t1.field1 = t2.field2
group by t1field1
Sadly, this caused the same performance... I wonder though, is it
possible to make an aggregate function like first(), last() in Oracle
(IIRC)? I believe that in such cases MySQL does first() by itself.
Other ideas are welcome too.
Regards,
Vitaly Belman
ICQ: 1912453
AIM: VitalyB1984
MSN: tmdagent(at)hotmail(dot)com
Yahoo!: VitalyBe
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2004-06-13 03:39:55 | Re: Additional select fields in a GROUP BY |
| Previous Message | Tom Lane | 2004-06-11 21:30:50 | Re: in-transaction insert performance in 7.5devel |