Как определить глобальные и локальные минимумы и максимумы в SQL Server 2008? - PullRequest
1 голос
/ 14 сентября 2010

Я пытаюсь найти лучший способ определения глобальных и локальных мин и макс для набора данных.Я думаю, что должен быть простой способ сделать это, но я не могу понять это.

Я использую 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 ]

4 голосов
/ 14 сентября 2010

Если вы не возражаете против использования 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        
0 голосов
/ 14 сентября 2010

Вы пытались сгруппировать данные по PersonID, а затем создать сумму на основе этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...