list_agg function

View as Markdown

The list_agg(value) aggregate function concatenates input values (including nulls) into a list. The input values to the aggregate can be filtered.

Syntax

list_agg ( <value>
  [ORDER BY <col_ref> [ASC | DESC] [NULLS FIRST | NULLS LAST] [, ...]]
)
[FILTER (WHERE <filter_clause>)]
Syntax element Description
<value> The values to concatenate.
ORDER BY <col_ref> [ASC | DESC] [NULLS FIRST | NULLS LAST] [, …] Optional. Specifies the ordering of values within the aggregation. If not specified, incoming rows are not guaranteed any order.
FILTER (WHERE <filter_clause>) Optional. Specifies which rows are sent to the aggregate function. Rows for which the <filter_clause> evaluates to true contribute to the aggregation. See Aggregate function filters for details.

Signatures

Parameter Type Description
value text The values to concatenate.

Return value

list_agg returns a list value.

Any ORDER BY applied before the aggregate function is evaluated, such as in a feeding subquery, is ignored. Unless ORDER BY is included in the aggregate function call itself, the order in which the values are aggregated is unspecified.

Details

Usage in dataflows

While list_agg is available in Materialize, materializing list_agg(values) is considered an incremental view maintenance anti-pattern. Any change to the data underlying the function call will require the function to be recomputed entirely, discarding the benefits of maintaining incremental updates.

Instead, we recommend that you materialize all components required for the list_agg function call and create a non-materialized view using list_agg on top of that. That pattern is illustrated in the following statements:

CREATE MATERIALIZED VIEW foo_view AS SELECT * FROM foo;
CREATE VIEW bar AS SELECT list_agg(foo_view.bar) FROM foo_view;

Examples

SELECT
    title,
    LIST_AGG (
        first_name || ' ' || last_name
        ORDER BY
            last_name
    ) actors
FROM
    film
GROUP BY
    title;
Back to top ↑