Последовательность периодов и кварталов

#sql #sql-server #database #tsql

#sql #sql-сервер #База данных #tsql

Вопрос:

Я пытаюсь найти способ создать последовательность для периодов дат и кварталов (не уверен, что это правильный термин).

В основном это поможет людям ориентироваться в датах на основе недель, периодов и кварталов, как только я присоединю это к нашим данным о продажах. Например, если я просто хочу узнать продажи за прошлую неделю, я мог бы просто использовать WHERE WeekSequence = -1 … Другой пример: менеджер хочет получить данные о продажах за прошлый квартал, я мог бы просто использовать WHERE QuarterSequence = -1 … что-то вроде этого.

Моя текущая таблица:

 WeekStartDate  WeekEndDate  CurrentWeek  Period  Quarter  WeekSequence
----------------------------------------------------------------------
2020-08-03     2020-08-09   0            2       1        -5
2020-08-10     2020-08-16   0            2       1        -4
2020-08-17     2020-08-23   0            2       1        -3
2020-08-24     2020-08-30   0            2       1        -2
2020-08-31     2020-09-06   0            2       1        -1
2020-09-07     2020-09-13   1            3       1        0
2020-09-14     2020-09-20   0            3       1        1
2020-09-21     2020-09-27   0            3       1        2
2020-09-28     2020-10-04   0            3       1        3
2020-10-05     2020-10-11   0            4       2        4
2020-10-12     2020-10-18   0            4       2        5
  

Как я хочу, чтобы это выглядело (выделено):

Цель

Комментарии:

1. Взгляните на следующий блог

2. Можете ли вы объяснить, что такое «Период»?

3. @Christian Я имею в виду финансовый период и квартал. Прошу прощения, если это было непонятно.

4. @PrebenHuybrechts это скорее создание фактического измерения даты. это не поможет…

5. @ChristianneRioOrtega Хорошо, но как определяется «Период»? То есть, когда (например, в каком месяце) начинается и заканчивается финансовый период?

Ответ №1:

Если я правильно понимаю, просто используйте оконные функции:

 select t.*,
       (period -
        max(case when currentweek = 1 then period end) over ()
       ) as periodsequence,
       (quarter -
        max(case when currentweek = 1 then quarter end) over ()
       ) as quartersequence       
from t;
  

Вы можете включить это в представление, а не помещать в таблицу.