Bird
Raised Fist0
PostgreSQLquery~10 mins

Array aggregation with ARRAY_AGG in PostgreSQL - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Array aggregation with ARRAY_AGG
Start Query
↓
Select rows
↓
Extract column values
↓
Aggregate values into array
↓
Return single row with array
↓
End Query
The query selects rows, extracts values from a column, aggregates them into an array, and returns the array as a single result.
Execution Sample
PostgreSQL
SELECT ARRAY_AGG(name) FROM employees;
This query collects all 'name' values from the 'employees' table into a single array.
Execution Table
StepActionInput RowAggregated Array StateOutput
1Start aggregationNone{}No output yet
2Read row{id:1, name:'Alice'}{'Alice'}No output yet
3Read row{id:2, name:'Bob'}{'Alice', 'Bob'}No output yet
4Read row{id:3, name:'Charlie'}{'Alice', 'Bob', 'Charlie'}No output yet
5Finish aggregationNone{'Alice', 'Bob', 'Charlie'}Return array ['Alice', 'Bob', 'Charlie']
💡 All rows processed; aggregation complete and array returned.
Variable Tracker
VariableStartAfter 1After 2After 3Final
aggregated_array{}['Alice']['Alice', 'Bob']['Alice', 'Bob', 'Charlie']['Alice', 'Bob', 'Charlie']
Key Moments - 3 Insights
Why does ARRAY_AGG return a single row with an array instead of multiple rows?
ARRAY_AGG combines multiple input rows into one array, so the output is a single row containing that array, as shown in execution_table row 5.
What happens if the input column has NULL values?
By default, ARRAY_AGG includes NULLs in the array. You can exclude them using FILTER or WHERE clauses. This is not shown in the current example but is important to know.
Can ARRAY_AGG preserve the order of rows?
Yes, by using ORDER BY inside ARRAY_AGG, you can control the order of elements in the array. Without ORDER BY, the order is arbitrary.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3. What is the state of the aggregated array?
A['Bob', 'Charlie']
B['Alice']
C['Alice', 'Bob']
D['Alice', 'Charlie']
💡 Hint
Check the 'Aggregated Array State' column at step 3 in the execution_table.
At which step does the query return the final array?
AStep 2
BStep 5
CStep 4
DStep 1
💡 Hint
Look for the step where 'Output' shows the array being returned in the execution_table.
If the employees table had no rows, what would ARRAY_AGG return?
ANULL
BAn empty array {}
CAn error
DAn array with one NULL element
💡 Hint
ARRAY_AGG returns NULL when no input rows exist; this is standard behavior in PostgreSQL.
Concept Snapshot
ARRAY_AGG(expression) aggregates multiple input values into a single array.
Returns one row with an array of all values.
Includes NULLs unless filtered.
Use ORDER BY inside ARRAY_AGG() to control element order.
Returns NULL if no input rows.
Useful for collecting column values into arrays in SQL.
Full Transcript
This visual execution shows how the PostgreSQL function ARRAY_AGG works. The query reads each row from the employees table, extracts the 'name' column, and adds it to an array. Step by step, the array grows from empty to include 'Alice', then 'Bob', then 'Charlie'. After all rows are processed, the query returns a single row containing the array of all names. Key points include that ARRAY_AGG returns one row with an array, includes NULLs by default, and returns NULL if no rows are found. This helps beginners see how aggregation collects multiple values into one array result.

Practice

(1/5)
1. What does the PostgreSQL function ARRAY_AGG do?
easy
A. It counts the number of rows in a table.
B. It collects multiple row values into a single array.
C. It sorts rows in ascending order.
D. It deletes duplicate rows from a table.

Solution

  1. Step 1: Understand the purpose of ARRAY_AGG

    ARRAY_AGG is used to gather multiple values from rows into one array value.
  2. Step 2: Compare with other options

    Counting rows uses COUNT(), deleting duplicates or sorting rows uses other clauses like DISTINCT or ORDER BY, not ARRAY_AGG.
  3. Final Answer:

    It collects multiple row values into a single array. -> Option B
  4. Quick Check:

    ARRAY_AGG = collects rows into array [OK]
Hint: ARRAY_AGG groups rows into one array [OK]
Common Mistakes:
  • Confusing ARRAY_AGG with COUNT or ORDER BY
  • Thinking ARRAY_AGG sorts data by default
  • Assuming ARRAY_AGG removes duplicates automatically
2. Which of the following is the correct syntax to aggregate values into an array using ARRAY_AGG in PostgreSQL?
easy
A. SELECT ARRAY_AGG(column_name) FROM table_name;
B. SELECT ARRAY_AGG column_name FROM table_name;
C. SELECT ARRAY_AGG(column_name) table_name;
D. SELECT ARRAY_AGG(column_name) FROM table_name WHERE;

Solution

  1. Step 1: Recall correct function call syntax

    ARRAY_AGG requires parentheses around the column name and a FROM clause.
  2. Step 2: Check each option

    SELECT ARRAY_AGG(column_name) FROM table_name; uses correct syntax with parentheses and FROM clause; others miss parentheses or have syntax errors.
  3. Final Answer:

    SELECT ARRAY_AGG(column_name) FROM table_name; -> Option A
  4. Quick Check:

    Correct ARRAY_AGG syntax uses parentheses and FROM [OK]
Hint: Always use parentheses with ARRAY_AGG(column) [OK]
Common Mistakes:
  • Omitting parentheses around column_name
  • Leaving incomplete WHERE clause
  • Missing FROM keyword
3. Given the table students with columns class and name, what is the output of this query?
SELECT class, ARRAY_AGG(name ORDER BY name) FROM students GROUP BY class ORDER BY class;
medium
A. [{class: '1A', array_agg: ['Alice']}, {class: '2B', array_agg: ['Charlie', 'David', 'Bob']}]
B. [{class: '1A', array_agg: ['Bob', 'Alice']}, {class: '2B', array_agg: ['David', 'Charlie']}]
C. [{class: '1A', array_agg: ['Alice', 'Charlie']}, {class: '2B', array_agg: ['Bob', 'David']}]
D. [{class: '1A', array_agg: ['Alice', 'Bob']}, {class: '2B', array_agg: ['Charlie', 'David']}]

Solution

  1. Step 1: Understand GROUP BY and ARRAY_AGG with ORDER BY

    The query groups rows by class and collects names into arrays sorted alphabetically.
  2. Step 2: Analyze the ordering inside ARRAY_AGG

    Names inside each class array are sorted ascending, so 'Alice' comes before 'Bob' in '1A', and 'Charlie' before 'David' in '2B'.
  3. Final Answer:

    [{class: '1A', array_agg: ['Alice', 'Bob']}, {class: '2B', array_agg: ['Charlie', 'David']}] -> Option D
  4. Quick Check:

    ARRAY_AGG with ORDER BY sorts array elements [OK]
Hint: ARRAY_AGG(... ORDER BY ...) sorts array elements [OK]
Common Mistakes:
  • Ignoring ORDER BY inside ARRAY_AGG
  • Mixing names between groups
  • Assuming ARRAY_AGG sorts groups, not elements
4. Identify the error in this query:
SELECT class, ARRAY_AGG(name ORDER BY) FROM students GROUP BY class;
medium
A. Missing column name after ORDER BY inside ARRAY_AGG.
B. GROUP BY clause is not allowed with ARRAY_AGG.
C. ARRAY_AGG cannot be used with ORDER BY.
D. Missing FROM keyword before table name.

Solution

  1. Step 1: Check syntax of ORDER BY inside ARRAY_AGG

    ORDER BY inside ARRAY_AGG requires a column name to specify sorting order.
  2. Step 2: Validate other parts of the query

    GROUP BY is valid with ARRAY_AGG; FROM clause is present; ORDER BY without column is invalid.
  3. Final Answer:

    Missing column name after ORDER BY inside ARRAY_AGG. -> Option A
  4. Quick Check:

    ORDER BY needs a column name inside ARRAY_AGG [OK]
Hint: ORDER BY inside ARRAY_AGG needs a column name [OK]
Common Mistakes:
  • Leaving ORDER BY empty inside ARRAY_AGG
  • Thinking GROUP BY disallows ARRAY_AGG
  • Forgetting to specify sorting column
5. You have a table orders with columns customer_id and product. You want to create a query that returns each customer_id with an array of unique products they ordered, sorted alphabetically. Which query achieves this?
hard
A. SELECT customer_id, ARRAY_AGG(product ORDER BY product) FROM orders GROUP BY customer_id;
B. SELECT customer_id, ARRAY_AGG(DISTINCT product) FROM orders GROUP BY customer_id ORDER BY product;
C. SELECT customer_id, ARRAY_AGG(DISTINCT product ORDER BY product) FROM orders GROUP BY customer_id;
D. SELECT customer_id, ARRAY_AGG(product) FROM orders ORDER BY customer_id;

Solution

  1. Step 1: Use ARRAY_AGG with DISTINCT and ORDER BY

    To get unique products sorted, use ARRAY_AGG(DISTINCT product ORDER BY product).
  2. Step 2: Group by customer_id to aggregate per customer

    GROUP BY customer_id ensures aggregation per customer; ORDER BY inside ARRAY_AGG sorts products alphabetically.
  3. Final Answer:

    SELECT customer_id, ARRAY_AGG(DISTINCT product ORDER BY product) FROM orders GROUP BY customer_id; -> Option C
  4. Quick Check:

    Use DISTINCT inside ARRAY_AGG with ORDER BY for unique sorted arrays [OK]
Hint: Use DISTINCT inside ARRAY_AGG with ORDER BY for unique sorted arrays [OK]
Common Mistakes:
  • Omitting DISTINCT causes duplicates in array
  • Placing ORDER BY outside ARRAY_AGG affects rows, not array elements
  • Not grouping by customer_id
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard