Of course, right when I hit send I thought of another option that makes the
SQL a little less readable but perhaps gets rid of the ambiguity.  Using
ordinals in the GROUP BY:

SELECT path[1], path[2], path[3], path[4], sum(value)
FROM bind_group_by
GROUP BY GROUPING SETS (
    (1, 2, 3, 4),
    (1, 2, 3),
    (1, 2),
    (1),
    ()
)
ORDER BY 1, 2, 3, 4;

Since I'm generating the SQL I'm not too worried about the readability and
it works with bind variables too.  I promise I'll stop thinking after this
one ;-)

Thanks!

  - Aner

On Wed, Sep 9, 2020 at 2:45 PM Tom Lane <t...@sss.pgh.pa.us> wrote:

> Aner Perez <aner.perez+pgsql-gene...@gmail.com> writes:
> > Or if using indexed path elements in the GROUP BY is the issue and I
> should
> > put the array indexing in a subselect and do the aggregation in the outer
> > select.  Like this:
>
> > -- Safer Subselect Version --
> > SELECT level1, level2, level3, level4, sum(value)
> > FROM (
> >     SELECT path[1] as level1, path[2] as level2, path[3] as level3,
> path[4]
> > as level4, value
> >     FROM bind_group_by
> > ) AS expanded
> > GROUP BY GROUPING SETS (
> >     (level1, level2, level3, level4),
> >     (level1, level2, level3),
> >     (level1, level2),
> >     (level1),
> >     ()
> > )
> > ORDER BY 1, 2, 3, 4;
>
> Yeah, that one looks a lot safer from here.  There's no question about
> which expressions are supposed to match what.  It should end up with
> the same plan, too.
>
>                         regards, tom lane
>

Reply via email to