Mysql ниже v8.0 назначение row_number (разбиение на) с помощью @num - PullRequest
0 голосов
/ 12 февраля 2020

Моя MySQL версия ниже v8.0, и я хотел бы назначить row_number () over (разбиение по AAB) с помощью таблицы ниже. Я попробовал следующие коды, и это не сработало. Как я могу заставить его работать?

select 
@part:=AAB as AAB,
AAG,AAD,
@num:=if(@part=AAB,@num:=@num+1,1) as rank
from IMPO_MEMB_AAAE a, (select @part:=null,@num:=0) b
order by AAB,AAG;

Table to rank

1 Ответ

0 голосов
/ 12 февраля 2020

Эта проблема подчеркивает проблему с использованием переменных для этой формы вычислений. Ваша проблема заключается в том, что вы оцениваете @num в списке SELECT позже, чем вы оцениваете @part, и, как это происходит, @part получает новое значение до того, как вычисляется @num, что означает, что @part=AAB всегда верно. Вы можете обойти это, поместив @num перед @part в списке SELECT, но, как говорится в руководстве :

Порядок вычисления выражений с участием пользовательских переменных не определено. Например, нет гарантии, что SELECT @a, @ a:=@a+1 сначала вычислит @a, а затем выполнит присваивание.

Как обычно, похоже, что он работает таким образом, поэтому до обновления вы, вероятно, можете использовать этот запрос:

select 
@num:=if(@part=AAB,@num:=@num+1,1) as rank,
@part:=AAB as AAB,
AAG,AAD
from IMPO_MEMB_AAAE a, (select @part:=null,@num:=0) b
order by AAB,AAG;

Вывод:

rank    AAB         AAG                     AAD
1       10000751    2020-01-02 16:06:00     41
1       10033980    2020-01-02 22:55:00     40
1       10041030    2020-01-02 22:50:00     41
2       10041030    2020-01-02 23:53:00     40
3       10041030    2020-01-02 23:53:00     40
4       10041030    2020-01-02 23:53:00     40
1       10049083    2020-01-02 12:58:00     41
2       10049083    2020-01-02 12:58:00     40
3       10049083    2020-01-02 12:58:00     40
4       10049083    2020-01-02 12:58:00     41
5       10049083    2020-01-02 12:58:00     40
6       10049083    2020-01-02 12:58:00     40
1       10061286    2020-01-02 05:44:00     41
1       10081536    2020-01-02 12:11:00     41
1       10092699    2020-01-02 19:12:00     41
1       10116976    2020-01-02 22:03:00     41

Демонстрация на dbfiddle

...