Preciso retornar um 0 ou 1 dependente dos registros anteriores. Tabela de exemplo:
DECLARE @x TABLE(ProductID INT, Failed bit, SampleDate date, LevelCode int);
INSERT @x VALUES
(101, 0, '20151201', 1),
(101, 1, '20151205', 2),
(101, 0, '20151206', 3),
(101, 1, '20151208', 2),
(102, 1, '20151202', 1),
(102, 0, '20151204', 2),
(102, 0, '20151205', 3),
(103, 0, '20160101', 1),
(103, 1, '20160102', 2),
(103, 0, '20160103', 2),
(104, 0, '20160101', 1),
(104, 0, '20160102', 2),
(104, 0, '20160103', 3);
A única coisa que importa no último registro é o LevelCode (ou seja, o último registro de cada ProductID). Não importa se o último registro foi aprovado/reprovado. Em seguida, examinamos todos os outros registros para esse ProductID (portanto, todos os registros antes do último registro) e, se houver uma falha com o mesmo LevelCode do último registro, definimos IsLastRunSameLevelAsPreviousRun como 1 senão 0:
ProductID IsLastRunSameLevelAsPreviousRun
101 1
102 0
103 1
104 0
Se não houver falhas para a , ProductID
o IsLastRunSameLevelAsPreviousRun
deve retornar 0.
Qualquer ajuda ou dicas são muito apreciadas.
Usando o LAG , você pode atingir seu objetivo sem junções:
O
cte
obtém oFailed
estado anterior para o mesmoLevelCode
para cada linha dentro de cadaProductID
grupo, retornando 0 quando não há nenhuma linha correspondente. Ele também calcula a última data em cada grupo para usá-la posteriormente para determinar a última linha do grupo.Isto é o que ele retorna:
O SELECT principal basicamente pega a última linha de cada grupo usando o
SampleDate = MaxSampleDate
filtro, puxando apenasProductID
ePrevFailed
também renomeando o último paraIsLastRunSameLevelAsPreviousRun
, para que a saída final se torne o que você deseja:Uma maneira de fazer isso é usar
ROW_NUMBER
duas vezes.Primeiro, numere todas as linhas da tabela particionadas pelo
ProductID
(CTE_RowNumbersAll
) e obtenha apenas a última linha para cadaProductID
(CTE_LastAll
).Em seguida, numere todas as linhas com falha (
CTE_RowNumbersFailed
) e obtenha a última linha com falha para cadaProductID
(CTE_LastFailed
).Finalmente
LEFT JOIN
resultados intermediários juntos e usadosCASE
para comparar osLevelCode
valores.Atualizar
Com base no seu último comentário, alterei a consulta.
CTE_RowNumbersFailed
agora é baseadoCTE_RowNumbersAll
e há um filtro extrarnAll > 1
para remover a última linha de consideração.Resultado
Espero que isto ajude