Групповые записи по периоду времени

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

Например, сегодня 04.05.2018, и если я установлю это в качестве даты начала и 31.05.2018 в качестве даты окончания, я получу следующее:

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 дней), так что с 04.05.18 по 17.05.18 значение столбца «TimePeriod» равно 1, а с 18.05.18 по 31.05.18 будет значение 2 для столбца «TimePeriod». И это должно быть динамическим, чтобы более широкие диапазоны дат группировались в периоды по две недели, при этом каждый период увеличивался на 1.

Предложения?


person MISNole    schedule 04.05.2018    source источник


Ответы (1)


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

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

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

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

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

    SELECT dd.Date , ( @DaysDiff - DATEDIFF(Day,dd.Date,@ToDate))/14
    FROM dbo.DateDimension AS [dd] WHERE dd.Date >= @StartDate AND dd.Date ‹ @ToDate;

person Mohamed    schedule 04.05.2018
comment
Спасибо - определенно нет необходимости использовать какую-либо функцию ранжирования, я просто экспериментировал с этим, пытаясь найти решение. Но это прекрасно работает — и да, я добавил +1 к периоду времени, чтобы получить то, на что я надеялся. Спасибо еще раз, - person MISNole; 05.05.2018