вы можете сделать это, чтобы найти начало и конец серий дат.
Преобразовать в «дату» через CTE (который, я думаю, существует в 2005 году), а затем использовать Cross Apply EXIST длянайдите начало и конец серии дат
, которую вы не указали для игрока и команды, но вы можете добавить условия WHERE в EXISTS, затем GROUP BY - при необходимости
;WITH dats as (SELECT CAST(LEFT(timeid, 6) + '01' as datetime) as DT from #DimensionTime)
select CONVERT(varchar(7),d1.DT,112) +'0' as strt,
CONVERT(varchar(7),dq.dt,112) +'0' as [end] from dats d1
CROSS APPLY
(SELECT TOP 1 d3.dt from dats d3 where
d3.dt > d1.dt
and
not exists(
select 0 from dats d4 where d4.DT = dateadd(month,1,d3.DT)
)
ORDER BY d3.dt asc) DQ
where not exists(select 0 from dats d2 where d2.DT = dateadd(month,-1,d1.DT)) ;
Догадываясь о некоторых образцах данных, я попытался
SELECT *
INTO #DimensionTime
FROM (
SELECT 1 AS [ID], 20180100 AS [TIMEID], 'john' as player, 'red' as team
UNION ALL
SELECT 2 AS [ID], 20180200 AS [TIMEID], 'john','red'
UNION ALL
SELECT 3 AS [ID], 20180300 AS [TIMEID], 'john','red'
UNION ALL
SELECT 4 AS [ID], 20180400 AS [TIMEID], 'john','red'
UNION ALL
SELECT 5 AS [ID], 20180500 AS [TIMEID], 'john','red'
UNION ALL
SELECT 7 AS [ID], 20180700 AS [TIMEID], 'john','red'
UNION ALL
SELECT 8 AS [ID], 20180800 AS [TIMEID], 'john','red'
UNION ALL
SELECT 9 AS [ID], 20180900 AS [TIMEID], 'john','red'
UNION ALL
SELECT 11 AS [ID], 20181100 AS [TIMEID], 'john','red'
UNION ALL
SELECT 12 AS [ID], 20181200 AS [TIMEID], 'john','red'
UNION ALL
SELECT 13 AS [ID], 20190100 AS [TIMEID], 'john','red'
UNION ALL
SELECT 14 AS [ID], 20190200 AS [TIMEID], 'john','red'
UNION ALL
SELECT 15 AS [ID], 20190300 AS [TIMEID], 'john','red'
UNION ALL
SELECT 1 AS [ID], 20180100 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 2 AS [ID], 20180200 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 4 AS [ID], 20180400 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 5 AS [ID], 20180500 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 8 AS [ID], 20180800 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 9 AS [ID], 20180900 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 12 AS [ID], 20181200 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 13 AS [ID], 20190100 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 14 AS [ID], 20190200 AS [TIMEID], 'luke','yellow'
UNION ALL
SELECT 15 AS [ID], 20190300 AS [TIMEID], 'luke','yellow'
) A
;WITH dats as (SELECT CAST(LEFT(timeid, 6) + '01' as datetime) as DT,player,team from #DimensionTime)
select d1.team,d1.player,
CONVERT(varchar(7),d1.DT,112) +'0' as strt,
CONVERT(varchar(7),dq.dt,112) +'0' as [end] from dats d1
CROSS APPLY
(SELECT TOP 1 d3.dt from dats d3 where
d3.dt > d1.dt
and
d3.player = d1.player
and
d3.team = d1.team
and
not exists(
select 0 from dats d4 where d4.DT = dateadd(month,1,d3.Dt)
and d4.team = d3.team
and d4.player = d3.player
)
ORDER BY d3.dt asc) DQ
where not exists(select 0 from dats d2 where
d2.player=d1.player
and
d2.team = d1.team
and
d2.DT = dateadd(month,-1,d1.DT) and d1.team=d2.team and d1.player = d2.player ) ;
drop table #DimensionTime;
с последними таблицами, которые, к сожалению, я пропустил, я разработал
;WITH dats as (SELECT CAST(LEFT(timeid, 6) + '01' as datetime) as DT,player,team from #LogPlayer)
select d1.team,d1.player,
CONVERT(varchar(7),d1.DT,112) +'0' as strt,
CONVERT(varchar(7),dq.dt,112) +'0' as [end] from dats d1
CROSS APPLY
(SELECT TOP 1 d3.dt from dats d3 where
d3.dt > d1.dt
and
d3.player = d1.player
and
d3.team = d1.team
and
not exists(
select 0 from dats d4 where d4.DT = dateadd(month,1,d3.Dt)
and d4.team = d3.team
and d4.player = d3.player
)
ORDER BY d3.dt asc) DQ
where not exists(select 0 from dats d2 where
d2.player=d1.player
and
d2.team = d1.team
and
d2.DT = dateadd(month,-1,d1.DT) and d1.team=d2.team and d1.player = d2.player ) ;