Tenho uma tabela com alterações de status que quero dividir em ilhas e, eventualmente, obter minha ilha mais atual com base em quando meu status mudou. Estou usando esta consulta para recuperar os códigos de status atual, anterior e próximo da minha tabela:
select
*,
case
when ping.GpsStatusTypeId <> ping.previousStatus
then 1
else 0
end as islandStarted
from
(select
Id,
GpsStatusTypeId,
CreatedAt,
lag(GpsStatusTypeId, 1) over (order by CreatedAt) as previousStatus,
lead(GpsStatusTypeId, 1) over (order by CreatedAt) as nextStatus
from
dbo.GpsPing p) ping
O resultado é assim:
Eu ia | ID do tipo de status do GPS | Criado em | status anterior | próximoStatus | ilhaIniciada |
---|---|---|---|---|---|
78E8C372-B7BE-4EED-8600-4925E7B66DBF | 6 | 2025-04-23 20:31:10.917 | 6 | 21 | 0 |
5CB42B3F-2542-4372-A169-5B664D971152 | 21 | 2025-04-23 17:46:40.217 | 6 | 21 | 1 |
F57421EF-43AE-42C5-B766-C1CC07277B2E | 21 | 2025-04-24 15:50:38.000 | 21 | 21 | 0 |
3C07F71E-39EF-4728-B0EF-DF8E5B9AE529 | 21 | 2025-04-24 17:07:38.000 | 21 | 21 | 0 |
5CB42B3F-2542-4372-A169-5B664D971152 | 21 | 2025-04-24 17:08:38.000 | 21 | NULO | 0 |
Quero retirar apenas minha última ilha ( GpsStatusTypeId = 21
) do resultado.
Você precisa de uma corrida
COUNT
para contar quantas ilhas passou. Isso se torna o ID do grupo. Depois, basta filtrar pelo ID do primeiro grupo.Neste caso, provavelmente é melhor descer e inverter
case
para=