# last, last\_value

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

Returns the last value in a group. `last_value` skips NULL values.

## Syntax

```scopeql
last(<expr>)
last_value(<expr>)
```

## Arguments

| Argument | Type     | Description  |
| -------- | -------- | ------------ |
| `<expr>` | Any type | Input value. |

## Returns

Returns the same type as the input.

* `last` returns the last value, even if it is NULL.
* `last_value` returns the last non-NULL value, or NULL if all values are NULL.
* Both return NULL for empty input.

## Usage notes

Use `WITHIN GROUP ORDER BY` before `AGGREGATE` to define row order. Without an explicit order, the selected value can vary.

## Examples

Compare the last campaign value with the last non-NULL campaign in a session:

```scopeql
VALUES
    ('s-17', 1, NULL::string), ('s-17', 2, 'spring'),
    ('s-17', 3, 'loyalty'), ('s-17', 4, NULL)
SELECT $0 AS session_id, $1 AS sequence, $2 AS campaign
GROUP BY session_id
WITHIN GROUP ORDER BY sequence
AGGREGATE
    last(campaign) AS latest_campaign,
    last_value(campaign) AS latest_known_campaign
```

```text
+------------+-----------------+-----------------------+
| session_id | latest_campaign | latest_known_campaign |
+------------+-----------------+-----------------------+
| s-17       | NULL            | loyalty               |
+------------+-----------------+-----------------------+
```

`last` preserves the missing value on the latest event; `last_value` skips it.
