# Aggregates

From: Steve Harris <steve.harris@garlik.com>
Date: Tue, 6 Dec 2011 22:40:49 +0000
Message-Id: <D8851796-5DD2-4641-B1C8-E0DAB2A6D90E@garlik.com>
Cc: Andy Seaborne <andy.seaborne@epimorphics.com>, birte.glimm@uni-ulm.de
To: SPARQL Working Group <public-rdf-dawg@w3.org>
```Hi all,

I've now got the aggregates in a state where I think all the information is carried through from one end of the query to the other… but I've thought that before :)

I also think ORDER BY is covered.

Here's a sketch of what I think should be happening:

Data

<a> <p> 1 .
<a> <p> 2 .
<b> <p> 3 .

Query

SELECT (MAX(?o) AS ?max) (MIN(?o) AS ?min)
WHERE { ?s ?p ?o }
GROUP BY ?s
ORDER BY AVG(?o)

Ω = Sol  ?s   ?p   ?o
μ1   <a>  <p>  1
μ2   <a>  <p>  2
μ3   <b>  <p>  3

G = Group((?s), Ω)
= { ((<a>), { μ1, μ2 }), ((<b>), { μ3 }) }

Q = SELECT agg1 agg2
WHERE { ?s ?p ?o }
GROUP BY ?s
ORDER BY agg3

E = { (?max, agg1), (?min, agg2) }

A1 = Aggregation((?o), Max, {}, G)
A2 = Aggregation((?o), Min, {}, G)
A3 = Aggregation((?o), Avg, {}, G)

J = AggregateJoin(A) =
{ { (agg1, 2), (agg2, 1), (agg3, 1.5) }
{ (agg1, 3), (agg2, 3), (agg3, 3) } }

Result = OrderBy(Extend(Extend(J, ?min, agg2), ?max, agg1), agg3)

I'm now going to look at the @@s from earlier today.

- Steve

--
Steve Harris, CTO, Garlik Limited
1-3 Halford Road, Richmond, TW10 6AW, UK
+44 20 8439 8203  http://www.garlik.com/
Registered in England and Wales 535 7233 VAT # 849 0517 11