#sql-server #stored-procedures
#sql-сервер #Хранимые процедуры
Вопрос:
У меня есть таблица с именем RowSettingStatus, подобная этой:
ReqNum WorkID RevNum RowStatus
1111 10 1 NULL
1111 10 5 NULL
1111 11 2 NULL
1111 11 10 NULL
1111 106 3 NULL
1111 10 11 NULL
1111 10 12 NULL
1111 10 13 NULL
1111 10 14 NULL
1111 10 15 NULL
1111 10 16 NULL
2222 51 1 NULL
2222 51 6 NULL
2222 10 7 NULL
2222 11 2 NULL
Мое требование касается определенного запроса, когда WorkID = 10, RowStatus будет обновляться на ‘F’, когда число оборотов будет минимальным, а RowStatus будет обновляться на ‘L’, когда число оборотов будет максимальным.Для других это будет «I» .
Например, когда я запускаю хранимую процедуру с параметром ReqNum = 1111.Она будет обновляться следующим образом за один раз.
ReqNum WorkID RevNum RowStatus
1111 10 1 F
1111 10 5 I
1111 11 2 F
1111 11 10 I
1111 106 3 F
1111 10 11 I
1111 10 12 I
1111 10 13 I
1111 10 14 I
1111 10 15 I
1111 10 16 L
2222 51 1 NULL
2222 51 6 NULL
2222 10 7 NULL
2222 11 2 NULL
Примечание: В таблице много строк.
Пожалуйста, кто-нибудь может написать процедуру?
Комментарии:
1. Вероятно, — вы попробовали? Это домашнее задание?
2. подумайте о статусе обращения, сэр
3. суммы обновления задают количество = случай, когда ID = 1, затем 15, еще 20 заканчиваются
4.Почему
1111,11,2
F
и / или почему1111,11,10
I
вместоL
? Подразумеваемое вами описание имело значение только для учета и учета, поэтому я не могу соответствовать вашему описанию и ожидаемому результату.WorkID
10
F
L
5. Предположим, что для WorkID = 10 RowStatus будет равен F с минимальным значением (RevNum), а RowStatus будет равен L с максимальным значением (RevNum). Другой RowStatus будет обновлен как I для этого конкретного WorkID
Ответ №1:
У меня есть что-то близкое к показанному вами желаемому результату, но, как указано в комментариях, требования и желаемый результат, похоже, не совпадают. Я думаю, я пытался соответствовать вашим письменным требованиям.
Пример таблицы / данных:
create table #RowSettingStatus (ReqNum int,WorkId int,RevNum int,RowStatus char(1))
insert into #RowSettingStatus (ReqNum, WorkID, RevNum, RowStatus)
select 1111, 10, 1, NULL union all
select 1111, 10, 5, NULL union all
select 1111, 11, 2, NULL union all
select 1111, 11, 10, NULL union all
select 1111, 106, 3, NULL union all
select 1111, 10, 11, NULL union all
select 1111, 10, 12, NULL union all
select 1111, 10, 13, NULL union all
select 1111, 10, 14, NULL union all
select 1111, 10, 15, NULL union all
select 1111, 10, 16, NULL union all
select 2222, 51, 1, NULL union all
select 2222, 51, 6, NULL union all
select 2222, 10, 7, NULL union all
select 2222, 11, 2, NULL
Фактическое обновление:
declare @ReqNum int
set @ReqNum = 1111
;with Numbered as (
select *,
ROW_NUMBER() OVER (PARTITION BY ReqNum,WorkID ORDER by RevNum) as rn1,
ROW_NUMBER() OVER (PARTITION BY ReqNum,WorkID ORDER by RevNum desc) as rn2
from
#RowSettingStatus
)
update Numbered set
RowStatus = CASE
WHEN rn1 = 1 THEN 'F'
WHEN rn2 = 1 THEN 'L'
ELSE 'I'
END
where ReqNum = @ReqNum
Результаты:
select * from #RowSettingStatus
ReqNum WorkId RevNum RowStatus
1111 10 1 F
1111 10 5 I
1111 11 2 F
1111 11 10 L --<-- This line doesn't match your output, but is the MAX(RevNum) for WorkId 11...
1111 106 3 F
1111 10 11 I
1111 10 12 I
1111 10 13 I
1111 10 14 I
1111 10 15 I
1111 10 16 L
2222 51 1 NULL
2222 51 6 NULL
2222 10 7 NULL
2222 11 2 NULL
Я использую ROW_NUMBER(), чтобы позволить мне находить «первую» и «последнюю» строки внутри каждой WorkId
, где порядок означает, что это, в свою очередь, значения MIN()
and MAX()
RevNum
.