如何确定sql server 2008中的全局和本地分钟和最大值?

时间:2010-09-14 13:20:13

标签: sql-server algorithm

我正在尝试找出确定数据集的全局和本地分钟和最大值的最佳方法。我认为必须有一个简单的方法来做到这一点,但我无法弄明白。

我正在使用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

我只是想找到所有可能连续的段,并且在没有循环或游标的情况下执行此操作。

有什么想法吗?

2 个答案:

答案 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对数据进行分组,然后根据该数据创建总和?