Вы можете использовать row_number()
для создания групп из 4 последовательных записей, начиная с самой последней. Затем вы можете сделать окно min()
s и max()
s для групп:
select
date,
periodId,
concat(
cast(min(date) over(partition by periodId) as varchar),
':',
cast(max(date) over(partition by periodId) as varchar)
) period
from (
select date, (row_number() over(order by date desc) + 3) / 4 periodId
from mytable
) t
Это предполагает, что date
имеет тип данных date
. Если это строка в формате yyymmdd
, нет необходимости cast()
.
select
date,
periodId,
concat(
min(date) over(partition by periodId),
':',
max(date) over(partition by periodId)
) period
from (
select date, (row_number() over(order by date desc) + 3) / 4 periodId
from mytable
) t
Демонстрация на DB Fiddle :
date | periodId | period
:--------- | :------- | :--------------------
2019-11-25 | 1 | 2019-11-04:2019-11-25
2019-11-18 | 1 | 2019-11-04:2019-11-25
2019-11-11 | 1 | 2019-11-04:2019-11-25
2019-11-04 | 1 | 2019-11-04:2019-11-25
2019-10-28 | 2 | 2019-10-07:2019-10-28
2019-10-21 | 2 | 2019-10-07:2019-10-28
2019-10-14 | 2 | 2019-10-07:2019-10-28
2019-10-07 | 2 | 2019-10-07:2019-10-28
2019-09-30 | 3 | 2019-09-30:2019-09-30