MySQL 5.0 назначить номер на основе другого столбца

0

Я пытался выяснить, как назначить номер (в моем случае номер группы, основанный на значении в другом столбце). У меня есть таблица с номером и на основе этого числа я пытаюсь присвоить номер группы. Номер - это порядок таблицы, и он может быть одинаковым для нескольких строк.

create table test (
    code varchar(10) primary key,
    num varchar(10) not null,
    name varchar(10) not null,
    surname varchar(10) not null);

insert into test values (1,9,'Tom', 'Smith');
insert into test values (2,9,'Adam','Blake');
insert into test values (3,15,'John','Smith');
insert into test values (4,15,'Adam','XYZ');
insert into test values (5,43,'John','Abc');
insert into test values (6,99,'Adam','Abc');
insert into test values (7,99,'John','Abc');

Итак, тестовая таблица выглядит так:

Изображение 174551

и желаемый результат выглядит так, где значение grp всегда является последовательным числом, начинающимся с 1.

Изображение 174551

Код для результатов:

create table result (
    code varchar(10) primary key,
    num varchar(10) not null,
    name varchar(10) not null,
    surname varchar(10) not null,
grp varchar(10) not null);

insert into result values (1,9,'Tom', 'Smith',1);
insert into result values (2,9,'Adam','Blake',1);
insert into result values (3,15,'John','Smith',2);
insert into result values (4,15,'Adam','XYZ',2);
insert into result values (5,43,'John','Abc',3);
insert into result values (6,99,'Adam','Abc',4);
insert into result values (7,99,'John','Abc',4);

Может ли это быть достигнуто без создания каких-либо функций и переменных? Есть ли псевдо-столбцы, которые описывают его и могут быть использованы?

Теги:

2 ответа

1
Лучший ответ

Использовать subquery:

select *, (select count(distinct t1.num) from test t1 where t1.num <= t.num) as grp
from test t;
1

Вы можете использовать коррелированный подзапрос:

select t.*,
       (select count(distinct t2.num)
        from test t2
        where t2.num <= t.num
       ) as grp
from test t;

Более эффективный метод использует переменные:

select t.*,
       (@grp := if(@n = t.num, @grp,
                   if(@n := t.num, @grp + 1, @grp + 1)
                  )
       ) as grp
from (select t.*
      from test t
      order by t.num
     ) t cross join
     (select @grp := 0, @n := -1) params;
  • 0
    Каким был бы дополнительный код, если бы я хотел проверить номер группы четным или нечетным (1 для четного, 0 для нечетного числа)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню