MySQL добавить столбец с числовой категорией, принимая приращение на основе значения и позиции другого столбца - PullRequest
0 голосов
/ 13 октября 2018

У меня есть таблица в MySQL, как описано ниже

rownum,value,status
1,16,1
2,32,1
3,16,1
4,23,0
5,33,0
6,16,0
7,22,0
8,13,1
9,43,1
10,32,1
11,45,0
12,28,0
13,23,0
14,28,0
15,31,1
16,13,1
17,44,1

Здесь третий столбец показывает состояние строки, в которую я хочу добавить новый столбец.Необходимая логика заключается в том, что для каждого набора повторяющихся значений 1 в столбце «статус» новый столбец получит номер, назначенный всем этим строкам.И это число будет увеличиваться с +1, когда будет найден следующий набор 1.выходная таблица должна выглядеть следующим образом.

rownum,value,status,category
1,16,1,1
2,32,1,1
3,16,1,1
4,23,0,null
5,33,0,null
6,16,0,null
7,22,0,null
8,13,1,2
9,43,1,2
10,32,1,2
11,45,0,null
12,28,0,null
13,23,0,null
14,28,0,null
15,31,1,3
16,13,1,3
17,44,1,3

Я немного запутался в том, как можно создать эту логику, и любые входные данные будут действительно полезны.Спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Вы можете достичь этого в MySQL, используя Определяемые пользователем переменные сеанса и используя условные функции, такие как If().Мы сохраняем значение статуса предыдущей строки в переменной @stat и сравниваем его со значением состояния текущей строки, чтобы получить результаты, как и предполагалось.

Но если это только для целей отображения, вам следует серьезно рассмотреть возможность передачи этого в свойкод приложения.

Тем не менее попробуйте следующий запрос ( DB Fiddle DEMO ):

SELECT 
  IF( dt.status = 0, 
      NULL, 
      IF( @stat = 0, @cat := @cat + 1, @cat )
    ) AS category, 
  dt.rownum, 
  dt.value, 
  @stat := dt.status AS status 
FROM 
(
 SELECT 
   rownum, 
   value, 
   status 
 FROM your_table
 ORDER BY rownum ASC 
) AS dt 
CROSS JOIN (SELECT @cat := 0, 
                   @stat := 0) AS init_user_vars
...