Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Finden Sie MIN- und MAX-Datum in einem diskontinuierlichen Zeitraum YYYYMM00

Dies ist eine Art Lücken-und-Inseln-Problem. Es ist sogar in nicht unterstützter alter Software wie SQL Server 2005 lösbar, da diese Version row_number() hat .

Ein Trick besteht darin, die Zeit-ID in eine richtige umzuwandeln Terminzeit. Der andere Trick besteht darin, die Gruppen zu definieren, indem eine fortlaufende Anzahl von Monaten vom Datums-/Uhrzeitwert subtrahiert wird:

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

Hier ist eine db<>Geige.