Групповые записи по периоду времени - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь взять временной интервал, который выбирает пользователь, а затем сгруппировать выборку по периодам времени - в данном случае: 2 недели.

Например, сегодня 5/4/2018, и если я установлю это в качестве своей даты начала и 31.05.2008 в качестве своей конечной даты, я получу следующее:

DECLARE @StartDate DATE ,
    @EndDate   DATE ,
    @ToDate    DATE;

SET @StartDate = GETDATE ();
SET @EndDate = '20180531';
SET @ToDate = DATEADD ( DAY, 1, @EndDate );

SELECT dd.Date ,
   ROW_NUMBER () OVER ( ORDER BY DATEPART ( WEEK, dd.Date )) AS [rownumb]
FROM   dbo.DateDimension AS [dd]
WHERE  dd.Date >= @StartDate
   AND dd.Date < @ToDate;

И результаты выглядят так:

Date        rownumb
2018-05-04  1
2018-05-05  2
2018-05-06  3
2018-05-07  4
2018-05-08  5
2018-05-09  6
2018-05-10  7
2018-05-11  8
2018-05-12  9
2018-05-13  10
2018-05-14  11
2018-05-15  12
2018-05-16  13
2018-05-17  14
2018-05-18  15
2018-05-19  16
2018-05-20  17
2018-05-21  18
2018-05-22  19
2018-05-23  20
2018-05-24  21
2018-05-25  22
2018-05-26  23
2018-05-27  24
2018-05-28  25
2018-05-29  26
2018-05-30  27
2018-05-31  28

Я играл с ROW_NUMBER (вместе с RANK и DENSE_RANK), но я не смог заставить эти функции выполнить то, что я ищу, но я надеюсь, что у меня есть дополнительный столбец, который называется TimePeriod, где даты сгруппированы с интервалом в 2 недели (или 14 дней), поэтому значения с 5/4/18 по 5/17/18 равны 1 для столбца «TimePeriod», а с 5/18/18 по 5/31 / 18 будет иметь значение 2 для столбца «TimePeriod». И это должно быть динамичным, чтобы более широкие диапазоны дат были сгруппированы по периодам в две недели с каждым периодом, увеличивающимся на 1.

Предложения

1 Ответ

0 голосов
/ 05 мая 2018

Если нет необходимости использовать функции упорядочения и ранжирования в SQL, вы можете легко реализовать, как показано ниже.

  • получить общее количество дней между начальной и конечной датой
  • для каждой даты вычитаете разницу дней текущей даты из общей разницы дней, а затем делите ее на 14
  • так что это, в основном, даст вам интервал (2 недели), к которому относится текущая дата, он равен нулю, поэтому вы можете добавить к нему 1

    ОБЪЯВИТЬ @StartDate DATE, @EndDate DATE, @ToDate DATE;

    ОБЪЯВИТЬ @DaysDiff INT;

    SET @StartDate = GETDATE (); SET @EndDate = '20180531'; SET @ToDate = DATEADD (ДЕНЬ, 1, @EndDate); - ПОЛУЧИТЕ разницу в днях между начальной и конечной датой SET @DaysDiff = DATEDIFF (День, @ StartDate, @ ToDate)

    ВЫБРАТЬ ДД. Дата, (@DaysDiff - DATEDIFF (Day, dd.Date, @ ToDate)) / 14
    ОТ dbo.DateDimension AS [dd] ГДЕ dd.Date> = @StartDate AND dd.Date <@ToDate; </p>

...