Я пытаюсь построить запрос в SQL Server Management Studio, используя цикл while для получения окончательного столбца Result.
Допустим, у меня уже есть запрос (My_query), в котором я извлекаю следующую информацию.
Выходная выборка
My_query уже дает мне всю информацию ниже без столбца Result . Мой план состоял в том, чтобы включить цикл while, который позволял бы мне определять правильный статус для каждого Периода и ID. Логика, которую я пытался использовать, была следующей:
Declare i int = 0
Declare j int = 0
Declare buffer int = 0
With My_query as (My query code is here)
Select *,
Result =
while (i <= 12) --This will be the number of rows coming from My_query.
Begin
set buffer = 0 -- Resetting the status variable for the next ID
while (j <= 6) -- This will be the number of periods for every ID. Max(Block)
Begin
If (Block = 1 and Status_History IS NULL) -- Block = 1 always will be the higher period consulted in My_query.
Set Result = Current_Status
Set buffer = Result
If (Block = 1 and Status_History IS NOT NULL)
Set Result = Status_History
Set buffer = Result
If (Block <> 1 and Status_History IS NULL)
Set Result = buffer
If (Block <> 1 and Status_History IS NOT NULL)
Set Result = Status_History
Set buffer = Result
Set j = j+1
END
Set i = i+1
END
From My_query
Решение:
Лучшим способом, который я нашел для решения этой проблемы, было создание индекса (помимо «блочного»), который позволяет мне определять конкретные изменения по группам. Индекс присваивает 0 значениям NULL, и каждый раз, когда значение, отличное от NULL, определяется как SUM 1 для индекса. Когда идентификатор меняется, индекс сбрасывается. Это решение намного проще в использовании ресурсов.
Индекс
SUM(CASE
WHEN(Status_History) IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY ID ORDER BY Period DESC) AS IND
Решение
WITH DAT AS (My_query)
SELECT *,
CASE WHEN IND = 0 THEN DAT.Current_Status ELSE MAX(DAT.Status_History) OVER ( PARTITION BY DAT.ID, DAT.IND ORDER BY DAT.Period DESC) END AS Result
FROM DAT
ORDER BY ID, Period DESC
ID Period Current_Status Status_History IND Block Result
1012 201903 32 NULL 0 1 32
1012 201902 32 NULL 0 2 32
1012 201901 32 16 1 3 16
1012 201812 32 NULL 1 4 16
1012 201811 32 NULL 1 5 16
1012 201810 32 10 2 6 10
1012 201809 32 NULL 2 7 10
5124 201903 25 NULL 0 1 25
5124 201902 25 23 2 2 23
5124 201901 25 29 3 3 29
5124 201812 25 NULL 4 4 29
5124 201811 25 NULL 5 5 29
5124 201810 25 NULL 6 6 29
5124 201809 25 NULL 7 7 29
Спасибо всем!