按时间段分组记录
Group Records By Time Period
我正在尝试采用用户选择的时间范围,然后将选择分组为时间段 - 在本例中为:2 周。
例如,今天是 2018 年 5 月 4 日,如果我将其设置为开始日期,将 2018 年 5 月 31 日设置为结束日期,我将得到以下信息:
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 的 [=22 值为 1 =] 列和 5/18/18 到 5/31/18 的 "TimePeriod" 列的值为 2。这应该是动态的,以便将更宽的日期范围分组为两周的时间段,每个时间段增加 1。
建议?
如果不需要使用sql中的排序和排名功能,您可以轻松实现如下。
- 获取开始日期和结束日期之间的总天数
- 对于每个日期,您从总天数差异中减去当前日期的天数差异,然后将其除以 14
所以这基本上会给你当前日期所属的间隔(2 周),它是从零开始的,所以你可能想给它加一个 1
声明@StartDate 日期,
@EndDate 日期,
@ToDate 日期;
声明@DaysDiff INT;
SET @StartDate = GETDATE();
SET @EndDate = '20180531';
SET @ToDate = DATEADD ( DAY, 1, @EndDate );
--获取开始日期和结束日期之间的天数差
SET @DaysDiff = DATEDIFF( 日, @StartDate,@ToDate )
SELECT dd.Date ,
( @DaysDiff - DATEDIFF(天,dd.Date,@ToDate) )/14
从 dbo.DateDimension 到 [dd]
其中 dd.Date >= @StartDate
AND dd.Date < @ToDate;
我正在尝试采用用户选择的时间范围,然后将选择分组为时间段 - 在本例中为:2 周。
例如,今天是 2018 年 5 月 4 日,如果我将其设置为开始日期,将 2018 年 5 月 31 日设置为结束日期,我将得到以下信息:
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 的 [=22 值为 1 =] 列和 5/18/18 到 5/31/18 的 "TimePeriod" 列的值为 2。这应该是动态的,以便将更宽的日期范围分组为两周的时间段,每个时间段增加 1。
建议?
如果不需要使用sql中的排序和排名功能,您可以轻松实现如下。
- 获取开始日期和结束日期之间的总天数
- 对于每个日期,您从总天数差异中减去当前日期的天数差异,然后将其除以 14
所以这基本上会给你当前日期所属的间隔(2 周),它是从零开始的,所以你可能想给它加一个 1
声明@StartDate 日期, @EndDate 日期, @ToDate 日期;
声明@DaysDiff INT;
SET @StartDate = GETDATE(); SET @EndDate = '20180531'; SET @ToDate = DATEADD ( DAY, 1, @EndDate ); --获取开始日期和结束日期之间的天数差 SET @DaysDiff = DATEDIFF( 日, @StartDate,@ToDate )
SELECT dd.Date , ( @DaysDiff - DATEDIFF(天,dd.Date,@ToDate) )/14
从 dbo.DateDimension 到 [dd] 其中 dd.Date >= @StartDate AND dd.Date < @ToDate;