#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. @Майки Извини, я думал, что это твой вопрос