ral Aggregate. For each department show the history of employee count in the department over time. :) declare function local:init($r) { let $table := (element department{($r), element time{xs:date($r/@tstart)}, element change{"+"}}, element department{($r), element time{xs:date($r/@tend)}, element change{"-"}} ) return $table }; declare function local:sort($xml) { for $e in $xml order by $e/time ascending return ($e) }; declare function local:embrace() { for $r in doc("v-emps.xml")/employees/employee/deptno let $xml := local:init($r) return $xml }; declare function local:overlap($time, $d) { for $r in doc("v-emps.xml")/employees/employee/deptno[text()/$d/text()] where (xs:date($r/@tstart) <= xs:date($time) and xs:date($r/@tend) >= xs:date($time)) return $r }; declare function local:emp_count($e) { if ($e/change/text() = "+") then ( let $num_overlap := count(local:overlap($e/time, $e/deptno)) return $num_overlap ) else if ($e/change/text() = "-") then ( let $num_overlap := (count(local:overlap($e/time, $e/deptno))-1) return $num_overlap ) else () }; declare function local:final() { let $big_xml := local:embrace() let $sorted_deps := local:sort($big_xml) for $e in $sorted_deps order by $e/deptno return element dept{($e/deptno), element emp_count{local:emp_count($e)}} }; let $f := local:final() order by $f/dept/deptno ascending return element data{$f}