row_number

Returns the zero-based row number within each window.

Syntax

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:

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
+----------+----------------------+-----------+
| order_id | event_time           | status    |
+----------+----------------------+-----------+
| o-17     | 2026-06-01T10:02:00Z | paid      |
| o-42     | 2026-06-01T10:04:00Z | cancelled |
+----------+----------------------+-----------+