row_ number
On this page
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 |
+----------+----------------------+-----------+