Aggregation & Grouping

Non-aggregated expressions in RETURN or WITH act as implicit grouping keys - no GROUP BY clause is needed.

Aggregation Functions

FunctionDescriptionExample
count(expr)Count non-null values (or count(*) for all rows)count(n)
collect(expr)Collect values into a listcollect(n.name)
sum(expr)Sum numeric valuessum(n.score)
avg(expr)Average numeric valuesavg(n.age)
min(expr)Minimum valuemin(n.created)
max(expr)Maximum valuemax(n.score)
percentileCont(expr, p)Continuous percentile (interpolated)percentileCont(n.age, 0.95)
percentileDisc(expr, p)Discrete percentile (exact value)percentileDisc(n.age, 0.5)
stdev(expr)Sample standard deviationstdev(n.score)
stdevp(expr)Population standard deviationstdevp(n.score)

Grouping Examples

-- Count per label
MATCH (n:Person) RETURN n.city, count(n) AS population
ORDER BY population DESC

-- Collect friends per person
MATCH (p:Person)-[:FRIEND]->(f:Person)
RETURN p.name, collect(f.name) AS friends

-- Aggregation with WITH for filtering
MATCH (p:Person)-[:FRIEND]->(f)
WITH p, count(f) AS friendCount
WHERE friendCount > 5
RETURN p.name, friendCount

DISTINCT

MATCH (n:Person)-[:LIVES_IN]->(c:City)
RETURN DISTINCT c.name

-- With count
MATCH (p:Person)-[:HAS_SKILL]->(s)
RETURN p.name, count(DISTINCT s) AS uniqueSkills