Извлечение столбца 4-недельного периода из столбца недели - PullRequest
0 голосов
/ 15 января 2020

У меня есть агрегированные еженедельные данные в моей таблице SQL. Столбец даты - это понедельник каждой недели, как показано ниже:

date
2019-11-25
2019-11-18
2019-11-11
2019-11-04
2019-10-28
2019-10-21
2019-10-14
2019-10-07
2019-09-30
..........

Мне нужны два производных столбца periodId как 1,2,3,..., а также period с определенным диапазоном дат, например 2019-11-04:2019-11-25.

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    ................
..........

Как это сделать в SQL или возможно ли такое манипулирование в SQL? Я на SQL сервере.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вы можете сделать это без подзапроса, если вам нравится:

select date,
       row_number() over (order by date) + 3 as period,
       concat(convert(varchar(10), 
                      dateadd(week, row_number() over (order by date) - 1, date)
                     ),
              ':',
              convert(varchar(10), 
                      dateadd(week, row_number() over (order by date) + 3, date)
                     )
             ) as dates
from t;
0 голосов
/ 15 января 2020

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...