我正在尝试找出确定数据集的全局和本地分钟和最大值的最佳方法。我认为必须有一个简单的方法来做到这一点,但我无法弄明白。
我正在使用Sql Server 2008。
假设我有一个用户订阅日期的数据集。
Start Date Stop Date PersonID
12/31/2007 3/31/2008 1
3/31/2008 6/30/2008 1
6/30/2008 9/30/2008 1
2/28/2008 3/31/2008 2
3/31/2008 4/30/2008 2
7/31/2008 8/31/2008 2
5/31/2008 6/30/2008 3
我知道其中一些日期是季度,有些是每月。
最终结果应为:
StartDate StopDate PersonID
12/31/2007 9/30/2008 1
2/28/2008 4/30/2008 2
7/31/2008 8/31/2008 2
5/31/2008 6/30/2008 3
我只是想找到所有可能连续的段,并且在没有循环或游标的情况下执行此操作。
有什么想法吗?
答案 0 :(得分:4)
如果您不介意使用CTE,则以下脚本会生成您所追求的结果。
<强> TESTDATA 强>
DECLARE @Users TABLE (
PersonID INTEGER
, StartDate DATETIME
, StopDate DATETIME
)
INSERT INTO @Users
SELECT 1, '12-31-2007', '3-31-2008'
UNION ALL SELECT 1, '3-31-2008','6-30-2008'
UNION ALL SELECT 1, '6-30-2008','9-30-2008'
UNION ALL SELECT 2, '2-28-2008','3-31-2008'
UNION ALL SELECT 2, '3-31-2008','4-30-2008'
UNION ALL SELECT 2, '7-31-2008','8-31-2008'
UNION ALL SELECT 3, '5-31-2008','6-30-2008'
SQL声明
;WITH q AS (
SELECT PersonID, StartDate, StopDate
FROM @Users
UNION ALL
SELECT u.PersonId, q.StartDate, u.StopDate
FROM q
INNER JOIN @Users u ON u.PersonID = q.PersonID
AND u.StartDate = q.StopDate
)
SELECT PersonID, MIN(StartDate), StopDate
FROM (
SELECT PersonID, StartDate, [StopDate] = MAX(StopDate)
FROM q
GROUP BY
PersonID, StartDate
) p
GROUP BY
PersonID, StopDate
ORDER BY
PersonID, 2, 3
答案 1 :(得分:0)
您是否尝试按PersonID对数据进行分组,然后根据该数据创建总和?