Re: Picking the first of an order in an aggregate query - Mailing list pgsql-general

From Robert James
Subject Re: Picking the first of an order in an aggregate query
Date
Msg-id CAGYyBgjxJ1KpaMn6Gg+ND9=A7GkrCTR-gzGUkGiFJiNzrMfy9Q@mail.gmail.com
Whole thread Raw
In response to Re: Picking the first of an order in an aggregate query  (François Beausoleil <francois@teksol.info>)
Responses Re: Picking the first of an order in an aggregate query  (Vincent Veyron <vv.lists@wanadoo.fr>)
List pgsql-general
On 12/31/12, François Beausoleil <francois@teksol.info> wrote:
>
> Le 2012-12-31 à 15:38, Robert James a écrit :
>
>> DISTINCT is a very simple solution!
>> But I have one problem: In addition to the FIRST fields, I also do
>> want some aggregate functions.  More accurately, it would be:
>>
>> SELECT grouping_field, FIRST(field_a), FIRST(field_b), SUM(field_x),
>> MAX(field_y)
>> ...
>>
>> How should I do that? Should I do two queries with a join on the
>> grouping field? Or is there a more direct way?
>
> WINDOW functions can help you:
>
> SELECT
>     grouping_field
>   , first_value(field_a) OVER (ORDER BY ...)
>   , first_value(field_b) OVER (ORDER BY ...)
>   , sum(field_x) OVER ()
>   , max(field_y) OVER ()
> FROM ...
>
> The empty OVER clauses will make the sum / max work over the full result
> set, and not a subset. I really recommend reading the window functions
> section on the site.
>

I see.  Will the optimizer know enough to not repeat the work for each
first_value I do? Or am I better off using a JOIN of some sort?


pgsql-general by date:

Previous
From: Philipp Kraus
Date:
Subject: Re: rights for schema
Next
From: Marko Tiikkaja
Date:
Subject: Recovering from an exception