Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Trova la data MIN e MAX in un periodo di tempo discontinuo AAAAMM00

Questo è un tipo di problema di lacune e isole. È risolvibile anche in software antichi non supportati come SQL Server 2005, perché quella versione ha row_number() .

Un trucco è convertire l'id temporale in un buono appuntamento. L'altro trucco è definire i gruppi sottraendo un numero sequenziale di mesi dal valore di data/ora:

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);

Qui è un db<>violino.