我有以下表结构
Key int
MemberID int
VisitDate DateTime
如何将所有日期范围内的日期分组为15天..同一成员的第一次访问应被视为开始日期。
例如
Key ID VisitDate(MM/dd/YY)
1 1 02/01/11
2 1 02/09/11
3 1 02/12/11
4 1 02/17/11
5 2 02/03/11
6 2 02/19/11
在这种情况下,结果应为
ID StartDate EndDate
1 02/01/11 02/12/11
1 02/17/11 02/17/11
2 02/03/11 02/03/11
2 02/19/11 02/19/11
答案 0 :(得分:3)
执行此操作的一种方法是使用window aggregating。方法如下:
设定:
DECLARE @data TABLE (
[Key] int, ID int, VisitDate date
);
INSERT INTO @data ([Key], ID, VisitDate)
SELECT 1, 1, '02/01/2011' UNION ALL
SELECT 2, 1, '02/09/2011' UNION ALL
SELECT 3, 1, '02/12/2011' UNION ALL
SELECT 4, 1, '02/17/2011' UNION ALL
SELECT 5, 2, '02/03/2011' UNION ALL
SELECT 6, 2, '02/19/2011';
查询:
WITH marked AS (
SELECT
*,
Grp = DATEDIFF(DAY, MIN(VisitDate) OVER (PARTITION BY ID), VisitDate) / 15
FROM @data
)
SELECT
ID,
StartDate = MIN(VisitDate),
EndDate = MAX(VisitDate)
FROM marked
GROUP BY ID, Grp
ORDER BY ID, StartDate
输出:
ID StartDate EndDate
----------- ---------- ----------
1 2011-02-01 2011-02-12
1 2011-02-17 2011-02-17
2 2011-02-03 2011-02-03
2 2011-02-19 2011-02-19
基本上,对于每一行,查询都会计算VisitDate
与同一VisitDate
的第一个ID
之间的天数差异,并将其除以15.然后使用结果作为分组标准。请注意,当/
运算符的两个操作数都是整数时,SQL Server使用整数除法。