Минимальное вступление в силу и срок действия для непрерывных дат - PullRequest
0 голосов
/ 12 мая 2009

Есть ли способ добиться следования с использованием запроса SQL 2000, я посмотрел везде, но не смог найти ни одного рабочего фрагмента.

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

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

ID  effdate     termdate
1   2007-05-01  2007-05-31
2   2007-06-01  2007-06-30
3   2007-07-01  2007-09-30
4   2008-03-01  2008-03-31
5   2008-05-01  2008-05-31
6   2008-06-01  2008-06-30

Ожидаемый результат:

2007-05-01  2007-09-30
2008-03-01  2008-03-31
2008-05-01  2008-06-30

Ответы [ 4 ]

2 голосов
/ 12 мая 2009

Я сделал что-то вроде этого, чтобы получить effdate и то же самое для termdate, сделал их двумя отдельными представлениями и получил окончательный результат.

SELECT distinct e0.effdate,e0.ID
  FROM  dbo.datatable e0    LEFT OUTER JOIN dbo.datatable PREV ON       
       PREV.ID = e0.ID 
 AND  PREV.termdate = DATEADD(dy, -1, e0.Effdate)        
  WHERE PREV.ID IS NULL   
0 голосов
/ 12 мая 2009

выберите min (effdate), max (termdate) из tab1 где year (effdate) = год (termdate) группа по годам заказ по мин. (эфф.)

Результат

2007-05-01 00: 00: 00.000 2007-09-30 00: 00: 00.000

2008-03-01 00: 00: 00.000 2008-06-30 00: 00: 00.000

0 голосов
/ 12 мая 2009

Я не думаю, что это возможно без использования временной таблицы. (Вы не исключаете их использования, но не исключали и использование курсоров, пока Майк Беннетт не опубликовал свой ответ)

Я достаточно уверен, что это универсальное решение - оно использует недокументированную функцию, позволяющую изменять значение переменной более одного раза во время оператора обновления.

Вы можете пропустить создание столбца искусственной идентификации, чтобы гарантировать порядок (autoID в моем запросе), если записи в вашей таблице введены в порядке обновления.

-- Setup test data

IF object_id('tempdb..#test1') IS NOT NULL
        DROP TABLE #test1
GO

CREATE TABLE #test1
(id INT
,effdate DATETIME
,termdate DATETIME
)

INSERT #test1
      SELECT 1,'2007-05-01','2007-05-31'
UNION SELECT 2 ,'2007-06-01','2007-06-30'
UNION SELECT 3 ,'2007-07-01','2007-09-30'
UNION SELECT 4 ,'2008-03-01','2008-03-31'
UNION SELECT 5 ,'2008-05-01','2008-05-31'
UNION SELECT 6 ,'2008-06-01','2008-06-30'
GO

IF object_id('tempdb..#t') IS NOT NULL
        DROP TABLE #t

GO

-- Order the records by effdate
SELECT IDENTITY(INT,1,1) AS autoId
,cast(NULL AS INT) groupID
,*
INTO #t
FROM #test1
ORDER BY effdate

UPDATE #t
SET groupID = 1
WHERE autoID = 1

DECLARE @gp INT
SET @gp = 1

--update groupID using the undocumented variable-update method
UPDATE t2
SET @gp = CASE WHEN t1.termdate = t2.effdate - 1
               THEN @gp 
               ELSE @gp + 1
          END
,groupID = @gp
FROM #t AS t1
JOIN #t AS t2
ON t1.autoID = t2.autoID - 1

--output results
select min(effdate), max(termdate)
from #t
group by groupID
order by groupID
0 голосов
/ 12 мая 2009

К сожалению, вам, вероятно, придется использовать курсор. Нечто подобное должно работать.

DECLARE @Results TABLE
(
    effdate DATETIME,
    termdate DATETIME
)

DECLARE @Date1 DATETIME, 
        @Date2 DATETIME,
        @StartDate DATETIME, 
        @EndDate DATETIME

DECLARE @Cursor CURSOR 

SET @Cursor = CURSOR FAST_FORWARD
FOR
SELECT effdate, termdate FROM <TABLE>

OPEN @Cursor
FETCH NEXT FROM @Cursor
INTO @Date1,@Date2

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @StartDate IS NULL
    BEGIN
        SELECT  @StartDate = @Date1,
                @EndDate = @Date2
    END
    ELSE
    BEGIN
        IF DateDiff(d,@EndDate,@Date1) = 1
        BEGIN
            SET @EndDate = @Date2
        END
        ELSE
        BEGIN
            INSERT INTO @Results
            SELECT @StartDate, @EndDate

            SELECT  @StartDate = @Date1,
                    @EndDate = @Date2
        END
    END


    FETCH NEXT FROM @Cursor
    INTO @Date1,@Date2
END

INSERT INTO @Results
SELECT @StartDate, @EndDate

CLOSE @Cursor
DEALLOCATE @Cursor 

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