I am trying to only generate row numbers for five rows of a given group_id
:
group_id | row_counter | other_columns
---------+-------------+--------------
111 | 1 | ...
111 | 2 | ...
111 | 3 | ...
111 | 4 | ...
111 | 5 | ...
111 | 6 | ...
111 | 6 | ...
111 | 6 | ...
111 | 6 | ...
222 | 1 | ...
222 | 2 | ...
222 | 3 | ...
222 | 4 | ...
333 | 1 | ...
333 | 2 | ...
I can't figure out how to reset the counter when the group changes:
SELECT @group_number := `group_id`,
CASE
WHEN (`group_id` = @group_number AND @row_number < 6)
THEN @row_number := @row_number + 1
WHEN (`group_id` = @group_number AND @row_number = 6)
THEN @row_number := 6
ELSE @row_number := 1
END AS `row_number`
FROM (SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 111 AS `group_id`
UNION ALL
SELECT 222 AS `group_id`
UNION ALL
SELECT 222 AS `group_id`
UNION ALL
SELECT 222 AS `group_id`
UNION ALL
SELECT 222 AS `group_id`
UNION ALL
SELECT 333 AS `group_id`
UNION ALL
SELECT 333 AS `group_id`) `m`
CROSS JOIN (SELECT @row_number := 0, @group_number := 0) AS `n`
Produces
group_id | row_number |
---|---|
111 | 1 |
111 | 2 |
111 | 3 |
111 | 4 |
111 | 5 |
111 | 6 |
111 | 6 |
111 | 6 |
111 | 6 |
222 | 6 |
222 | 6 |
222 | 6 |
222 | 6 |
333 | 6 |
333 | 6 |