JSONiq follows the W3C standard for let clauses. The following explanations, provided as an informal summary for convenience, are non-normative.
Figure 58. LetClause
Let bindings can be used to define aliases for any sequence, for convenience.
For each incoming tuple, the expression in the let clause is evaluated to a sequence. A binding is added from this sequence to the let variable in each tuple. A tuple is hence produced for each incoming tuple.
Example 132. An order by clause.
for $x in collection("captains") let $century := $x.century group by $century let $number := count($x) where $number gt 1 return { "century" : $century, "count" : $number }
Result (run with Zorba): { "century" : 24, "count" : 4 }
Note that it is perfectly fine to reuse a variable name and hide a variable binding.
Example 133. An order by clause.
for $x in collection("captains") let $century := $x.century group by $century let $number := count($x) let $number := count(distinct-values(for $series in $x.series return typeswitch($series) case array return $series() default return $series )) where $number gt 1 return { "century" : $century, "number of series" : $number }
Result (run with Zorba): { "century" : 24, "number of series" : 3 }