# row\_number

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

Returns the zero-based row number within each window.

## Syntax

```scopeql
row_number()
```

## Arguments

None.

## Returns

Returns `int`, starting at 0 in each group.

## Usage notes

Use in a `WINDOW` clause. `GROUP BY` defines independent groups, and `WITHIN GROUP ORDER BY` defines the row order.

## Examples

Sort order updates from newest to oldest, then keep row 0 in each group. Use the event ID to break timestamp ties:

```scopeql
VALUES
    ('o-17', '2026-06-01T10:00:00Z', 'evt-1', 'created'),
    ('o-17', '2026-06-01T10:02:00Z', 'evt-2', 'paid'),
    ('o-42', '2026-06-01T10:01:00Z', 'evt-3', 'created'),
    ('o-42', '2026-06-01T10:04:00Z', 'evt-4', 'cancelled')
SELECT $0 AS order_id, $1::timestamp AS event_time, $2 AS event_id, $3 AS status
GROUP BY order_id
WITHIN GROUP ORDER BY event_time DESC, event_id DESC
WINDOW row_number() AS position
WHERE position = 0
SELECT order_id, event_time, status
ORDER BY order_id
```

```text
+----------+----------------------+-----------+
| order_id | event_time           | status    |
+----------+----------------------+-----------+
| o-17     | 2026-06-01T10:02:00Z | paid      |
| o-42     | 2026-06-01T10:04:00Z | cancelled |
+----------+----------------------+-----------+
```
