Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Encontre a data MIN e MAX em um período descontínuo de tempo YYYYMM00


Este é um tipo de problema de lacunas e ilhas. É solucionável mesmo em software antigo não suportado como o SQL Server 2005, porque essa versão tem row_number() .

Um truque é converter o ID de tempo para um bona fide data hora. O outro truque é definir os grupos subtraindo um número sequencial de meses do valor de data/hora:
select player, team, min(timeid), max(timeid)
from (select lp.*,
             row_number() over (partition by player, team order by timeid) as seqnum,
             cast(cast(timeid + 1 as varchar(255)) as datetime) as yyyymm
      from logplayer lp
     ) lp
group by player, team, dateadd(month, - seqnum, yyyymm)
order by player, team, min(timeid);

Aqui é um db<>fiddle.