# object\_agg

[Read this page in HTML](https://www.scopedb.io/docs/reference/functions/aggregate/object_agg)

Collects key-value pairs into an object.

## Syntax

```scopeql
object_agg(<key>, <value>)
```

## Arguments

| Argument  | Type     | Description                                  |
| --------- | -------- | -------------------------------------------- |
| `<key>`   | `string` | Object key. Rows with NULL keys are skipped. |
| `<value>` | Any type | Associated value. NULL values are retained.  |

## Returns

Returns `object`. Returns `{}` for empty input or when every key is NULL. For duplicate keys, the last value in the aggregation order is kept.

## Usage notes

Use unique keys, or `WITHIN GROUP ORDER BY` before `AGGREGATE` to define which duplicate value wins.

## Examples

Combine attribute updates into one object per event. Order them by sequence to keep the latest value for each key:

```scopeql
VALUES
    ('evt-17', 1, 'region', 'apac'), ('evt-17', 2, 'channel', 'web'),
    ('evt-17', 3, 'region', 'emea'), ('evt-42', 1, 'channel', 'mobile')
SELECT $0 AS event_id, $1 AS sequence, $2 AS attribute, $3 AS value
GROUP BY event_id
WITHIN GROUP ORDER BY sequence
AGGREGATE object_agg(attribute, value) AS attributes
ORDER BY event_id
```

```text
+----------+-----------------------------------+
| event_id | attributes                        |
+----------+-----------------------------------+
| evt-17   | {"channel":"web","region":"emea"} |
| evt-42   | {"channel":"mobile"}              |
+----------+-----------------------------------+
```

The region for `evt-17` is `emea`, while its channel is retained.
