Aggregation, performed with the aggr operator, is a special form of proj with the additional feature of allowing aggregation calculations on another table. It has the form tab.aggr(other, ...) where other is another table. Without the argument other, aggr and proj are exactly equivalent. Aggregation allows adding calculated attributes to each entity in tab based on aggregation functions over attributes in the matching entities of other.

Aggregation functions include count, sum, min, max, avg, median, percentile, stdev, var, and others. Aggregation functions can only be used in the definitions of new attributes within the aggr operator.

As with proj, the output of aggr has the same entity class, the same primary key, and the same number of elements as tab. Primary key attributes are always included in the output and may be renamed, just like in proj.


% Number of students in each course section
university.Section.aggr(university.Enroll, 'count(*)->n')
% Average grade in each course
university.Course.aggr(university.Grade * university.LetterGrade, 'avg(points)->avg_grade')