Nested Aggregate Expressions

Can aggregate expressions contain aggregates?

This comes from a recent email [1] and while these may well not actually 
address the application goal (a subquery was meant - see thread), the 
SPARQL 1.1 Query spec does permit these unusual queries.

Example:

PREFIX ex: <http://example.org/meals#>
SELECT (AVG(?mealPrice * (1.0 + MAX( ?mealTip / ?mealPrice)))
            AS ?avgCostWithBestTip)
WHERE {
   ?description ex:mealPrice ?mealPrice .
   ?description ex:mealTip ?mealTip .
} GROUP BY ?description

i.e.an aggregate inside an aggregate:  AVG(?x * MAX (?y) )


One line of argument is that the expression inside the aggregate is 
applied to each row, so only row variables should be considered 
in-scope.  The aggregate AVG(max(?x)+1) is violating that as max(?x) is 
not a per-row expression.


What ARQ does is to calculate the aggregates of a group as the group 
streams past; it does not wait until the end of evaluation of the whole 
block when all the elements of all the groups are known.


Related to this is the interaction with select expressions:

SELECT (max(?x) As ?M) (avg(?M+1) AS ?A)

because the select expression rules say you can use ?M inside AVG().

If we wish to forbid this, we can do it quite easily by having a parser 
rule that aggregates can't appear in expression for the aggregate, which 
is a simple static check.

 Andy

[1] http://s.apache.org/Yy6

Received on Sunday, 3 June 2012 15:04:32 UTC