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

From Vincent Veyron
Subject Re: Picking the first of an order in an aggregate query
Date
Msg-id 1357664597.2431.40.camel@asus-1001PX.home
Whole thread Raw
In response to Re: Picking the first of an order in an aggregate query  (Robert James <srobertjames@gmail.com>)
List pgsql-general
Le lundi 31 décembre 2012 à 20:55 -0500, Robert James a écrit :
> 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?
>
>

You probably can check with explain analyze; if not, a CTE (common table
expression) might help; something like :

with t1 as (
select grouping_field, sum(field_x) as sum_x, max(field_y) as max_y
FROM ...
group by grouping_field
)
SELECT grouping_field,
first_value(field_a) OVER (Partition by grouping_field ORDER BY ...),
first_value(field_b) OVER (Partition by grouping_field ORDER BY ...),
t1.sum_x,
t1.max_y
FROM ... INNER JOIN t1 using (grouping_field)

'Partition by grouping_field' may or may not be necessary in your case,
depending on what you want; see :

http://www.postgresql.org/docs/current/static/tutorial-window.html

--
Vincent Veyron
http://marica.fr
Logiciel pour département juridique



pgsql-general by date:

Previous
From: James Cowell
Date:
Subject: Re: [Solved] Corrupt indexes on slave when using pg_bulkload on master
Next
From: Stefan Keller
Date:
Subject: Re: [postgis-users] Query with LIMIT but as random result set?