0

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
Kermit
  • 33,827
  • 13
  • 85
  • 121

1 Answers1

1

Below you will find the same answer from Mark Byers , but with a little change based on your requirements.

SELECT group_id ,
       rn
FROM ( SELECT group_id,
              @rn := IF(@prev = group_id, @rn + 1, 1) AS rn,
              @prev := group_id
       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`
       JOIN (SELECT @prev := NULL, @rn := 0) AS vars
       ORDER BY group_id
     ) AS T1
     

You should consider upgrade to 8.x

https://dbfiddle.uk/EFS4fit3

Another simplified example

SELECT t.*, 
       @rownum := @rownum + 1 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`
                ) t, 
       (SELECT @rownum := 0) r

https://dbfiddle.uk/-N9a2mIb

Ergest Basha
  • 7,870
  • 4
  • 8
  • 28