Re: Why does "group by" need to match select fields?

From: Erik Jones <erik(at)myemma(dot)com>
To: Omar Eljumaily <omar2(at)omnicode(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Why does "group by" need to match select fields?
Date: 2007-03-01 16:27:07
Message-ID: BE497A08-38F9-4531-B014-18A2C41273F1@myemma.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Feb 28, 2007, at 6:57 PM, Omar Eljumaily wrote:

> OK, I see what's going on. I can have more than one max(amount)
> with the same amount and payee. Thanks so much. Like I said, it's
> sort of dogged me off and on many times.
>
> Thanks.
>
>
> Bill Moran wrote:
>> Omar Eljumaily <omar2(at)omnicode(dot)com> wrote:
>>
>>> Sorry if this isn't exactly postgresql specific. I periodically
>>> run into this problem, and I'm running into it now. I'm
>>> wondering if there's something about "group by" that I don't
>>> understand. As an example what I'd want to do is return the "id"
>>> value for the check to each payee that has the highest amount.
>>> It seems like there's no problem with ambiguity in logic, but
>>> postgresql + other sql servers balk at it. The group by fields
>>> need to explicitly match the select fields with the exception of
>>> the aggregate function(s?).
>>>
>>> create table checks
>>> {
>>> id serial,
>>> payee text,
>>> amount double
>>> };
>>>
>>> select max(amount), payee, id from checks group by payee;
>>>
>>> Why won't the above work? Is there another way to get the id for
>>> the record with the highest amount for each payee?
>>>
>>
>> Because it's ambiguous. If you're grabbing max() for amount, which
>> id tuple do you want?
>>
>> Perhaps the way you're storing your data, those answers aren't
>> ambiguous,
>> but the database doesn't know that. Take this query as an example:
>>
>> select max(amount), max(checknumber), payee from checks group by
>> payee;
>>
>> In that case, the highest checknumber and the highest check amount
>> probably won't come from the same tuple. If you were to throw in
>> there:
>>
>> select max(amount), max(checknumber), payee, id from checks group
>> by payee;
>>
>> Which id does it give you? The one that matches max(amount) or
>> the one
>> that matches max(checknumber)?

Omar, note that in many cases you can do:

select c.amount, c.payee, c.id
from checks c
where c.amount = (select max(amount)
from checks
where payee=c.payee);

erik jones <erik(at)myemma(dot)com>
sofware developer
615-296-0838
emma(r)

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Joshua D. Drake 2007-03-01 16:27:19 Re: creating a function with a variable table name
Previous Message Joshua D. Drake 2007-03-01 16:26:34 Re: supporting 2000 simultaneous connections.