Столбец SQL Set с ключом и максимальным значением из другого столбца

#sql #cursor #sql-server-2017 #temporal

Вопрос:

Мне нужно обновить столбец «max_register» в соответствии с максимальным значением из столбца «длительность» того же идентификатора, установить значение = 1, а остальные значения = 0.

Исходная таблица:

 Id | duration | max_register
1  |  0       | 0
1  |  7       | 0
1  |  3       | 0
2  |  10      | 0
2  |  5       | 0
2  |  0       | 0
3  |  6       | 0
3  |  5       | 0
3  |  0       | 0
 

Конечная таблица:

 Id | duration | max_register
1  |  0       | 0
1  |  7       | 1
1  |  3       | 0
2  |  10      | 1
2  |  5       | 0
2  |  0       | 0
3  |  6       | 1
3  |  5       | 0
3  |  0       | 0
 

Это временная таблица с тысячью регистров. Поэтому я не знаю, нужно ли использовать курсор или что-то в этом роде.

Комментарии:

1. вы используете mysql 8 или что-то более раннее?

2. Что такое временная таблица? Вы имеете в виду временный стол?

3. Я использую SQL 2017

Ответ №1:

в mysql 5.7 :

 update tablename t1
set max_register = 1
where (id, duration)  = ( 
                          select id, duration 
                          from tablename t2
                          where t1.id = t2.id 
                          order by t2.duration limit 1
)
 

в sql server , если у вас есть столбец даты , вы можете использовать этот запрос:

 update  t
set max_register = 1
from ( 
   select max_register , row_number() over (partition by id order by duration desc, dateCol desc) rn 
   from tablename
) t where  t.rn = 1 
 

Комментарии:

1. Это не ошибка в этом хорошем решении, скорее деловое решение/правило: что происходит в случаях связей — две записи в группе с максимальной продолжительностью 5? Возможно, потребуется запустить правило принятия бизнес-решений для очистки связей и выбора одной максимальной продолжительности, прежде чем отмечать ее.

2. @mikeY ну, с вашей текущей структурой таблиц вы не можете . у вас должен быть уникальный ключ в вашей таблице

3. В случае двух или более записей с одинаковым значением второй используемый фильтр основан на другом столбце под названием «дата», берите более свежие данные.

4. @eshirvana Это не мои данные, и я не ОП. Я просто пытался указать, что если у OP есть случай, когда есть две записи с идентификатором 3, каждая из которых имеет значение длительности 6, эта операция должна быть готова к этому. У операции, похоже, есть поле даты, которое мы не видим, чтобы обрабатывать вещи.

5. @Майки Извини, я думал, что это твой вопрос