Я пропустил даты, так как ваша Week
нумерация может отличаться, но принцип тот же, если у вас уже есть номер Week
в ваших исходных данных. Все, что вам нужно сделать, это найти число max
Week
по Month
, затем с помощью self join
вернуть все значения Week
в том же году с меньшим значением:
declare @t table([Year] int,[Month] varchar(15),[Week] int);
insert into @t values(2019,'January',1),(2019,'January',2),(2019,'January',4),(2019,'February',5),(2019,'February',6),(2019,'February',7),(2019,'February',8),(2019,'March',9),(2019,'March',10),(2019,'March',11),(2019,'March',12),(2019,'March',13);
with m as
(
select [Year]
,[Month]
,max([Week])-2 as MaxWeek
from @t
group by [Year]
,[Month]
)
select m.[Year]
,m.[Month]
,t.[Week]
from @t as t
join m
on t.[Year] = m.[Year]
and t.[Week] <= m.MaxWeek
order by m.[Year]
,m.[Month] -- Replacing this with your actual date value should give you correct sorting
,t.[Week];
выход
+------+----------+------+
| Year | Month | Week |
+------+----------+------+
| 2019 | February | 1 |
| 2019 | February | 2 |
| 2019 | February | 4 |
| 2019 | February | 5 |
| 2019 | February | 6 |
| 2019 | January | 1 |
| 2019 | January | 2 |
| 2019 | March | 1 |
| 2019 | March | 2 |
| 2019 | March | 4 |
| 2019 | March | 5 |
| 2019 | March | 6 |
| 2019 | March | 7 |
| 2019 | March | 8 |
| 2019 | March | 9 |
| 2019 | March | 10 |
| 2019 | March | 11 |
+------+----------+------+