Re: Using aggregates to get sums and partial sums in one query

From: Andreas Joseph Krogh <andreas(at)visena(dot)com>
To: pgsql-sql(at)postgresql(dot)org
Subject: Re: Using aggregates to get sums and partial sums in one query
Date: 2014-11-10 18:52:42
Message-ID: VisenaEmail.c0.76488173e5def8d5.1499b0937b2@tc7-visena
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

På mandag 10. november 2014 kl. 17:19:10, skrev David G Johnston <
david(dot)g(dot)johnston(at)gmail(dot)com <mailto:david(dot)g(dot)johnston(at)gmail(dot)com>>: Igor Neyman
wrote
> select p.name, sum(distinct m.years_experience) as years_exp_in_project,

This is wrong on its face; two different people with the same experience
will result in under-counting

You need to figure out some way for the DISTINCT to include a personID and
then just sum up the year_experience for each individual.  My initial
thought was to use "ARRAY_AGG(DISTINCT composite_type)" to construct the
unique dataset then pass the result through a custom function that would
unnest(...) that array, pull out the years, sum them, and return the sum.

> count(distinct (m.id, m.role))

Not technically a true role count if two people share the same role - it is
unclear from the query what constraints the problem domain imposes.  This
can be a solution for this column.

I don't really see how using a couple of CTEs to build up summaries for each
table and then joining them together in an outer query is problematic.  TBH
it would probably be easier to maintain than one single super query with a
bunch of distinct aggregates; and I doubt there would be much if any
performance hit.   Using CTEs is what I am doing, just wondered if there is
any other viable solution. In reality the query uses paging with "total count"
(count(*) with the same FROM-clause) because the dataset is large. The query is
dynamically built up and counting totals with the "group by" required (when not
using CTEs) in main-query easily messes up the total-count.   -- Andreas Joseph
Krogh CTO / Partner - Visena AS Mobile: +47 909 56 963 andreas(at)visena(dot)com
<mailto:andreas(at)visena(dot)com> www.visena.com <https://www.visena.com>
<https://www.visena.com>  

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Seb 2014-11-12 21:49:57 matching against start/end times and diagnostic values (was: filtering based on table of start/end times)
Previous Message David G Johnston 2014-11-10 16:19:10 Re: Using aggregates to get sums and partial sums in one query