Как я могу вернуть список записей на основе непрерывных назначений времени в SQL Server 2000 - PullRequest
1 голос
/ 10 февраля 2009

У меня есть таблица, которая выглядит так:

IP            Hostname   TransactionDate
------------- ---------- -------------------
1.1.1.1       A          2009-01-01 01:00:00
1.1.1.1       A          2009-01-02 01:00:00
1.1.1.1       A          2009-01-03 01:45:00
1.1.1.1       B          2009-01-04 01:00:00
1.1.1.1       A          2009-01-05 01:00:00

Я хотел бы создать запрос, возвращающий записи, которые будут группировать результаты в зависимости от того, как долго они непрерывно удерживают IP-адрес:

т.е. (выбор или IP 1.1.1.1):

Hostname    GrantDate            ExpireDate
----------- ---------------      -----------------
A           2009-01-01 01:00:00  2009-01-04 01:00:00
B           2009-01-04 01:00:00  2009-01-05 01:00:00
A           2009-01-05 01:00:00  NULL

Как лучше всего выполнить эту задачу? Я хотел бы избежать курсоров, где это возможно. Я использую SQL Server 2000, что делает это более сложным ...

Ответы [ 2 ]

1 голос
/ 10 февраля 2009

Существует несколько способов решения этой проблемы в «1001 * SQL-головоломках и ответах» Джо Селко . У Google есть выдержка , которая включает их. Его примеры включают время начала и окончания, но адаптировать их должно быть довольно просто.

0 голосов
/ 11 февраля 2009

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

SET NOCOUNT ON
DECLARE @ip VARCHAR(15)
    SET @ip = '1.1.1.1'

DECLARE @dhcplog TABLE(IP VARCHAR(15), HOSTNAME VARCHAR(32), IPDATE DATETIME)
DECLARE @results TABLE(IP VARCHAR(15), HOSTNAME VARCHAR(32), STARTDATE DATETIME, ENDDATE DATETIME)
INSERT INTO @dhcplog VALUES('1.1.1.1', 'A', '2009-01-01 01:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'A', '2009-01-02 02:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'A', '2009-01-05 03:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'B', '2009-01-07 04:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'B', '2009-01-07 10:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'B', '2009-01-08 05:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'C', '2009-01-09 06:00:00')
INSERT INTO @dhcplog VALUES('1.1.1.1', 'A', '2009-01-10 07:00:00')

DECLARE @cHOST VARCHAR(32)
DECLARE @cEND DATETIME

DECLARE @tIP VARCHAR(15)
DECLARE @tHOST VARCHAR(32)
DECLARE @tIPDATE DATETIME

DECLARE IPCursor CURSOR FOR SELECT IP, HOSTNAME, IPDATE
                            FROM @dhcplog
                            WHERE IP = @ip
                            GROUP BY IP, HOSTNAME, IPDATE
                            ORDER BY IPDATE DESC

OPEN IPCursor
    FETCH NEXT FROM IPCursor INTO @tIP, @tHOST, @tIPDATE
        WHILE @@FETCH_STATUS = 0
            BEGIN
                IF @tHOST = @cHOST
                    BEGIN
                        UPDATE @results
                        SET STARTDATE = @tIPDATE
                        WHERE HOSTNAME = @cHOST
                        AND ENDDATE = @cEND
                    END
                ELSE
                    BEGIN
                        INSERT INTO @results (IP, HOSTNAME, STARTDATE, ENDDATE)
                        VALUES (@tIP, @tHOST, @tIPDATE, @tIPDATE)
                        SET @cHOST = @tHOST
                        SET @cEND = @tIPDATE
                    END
                FETCH NEXT FROM IPCursor INTO @tIP, @tHOST, @tIPDATE
            END
CLOSE IPCursor
DEALLOCATE IPCursor

SELECT * FROM @results

SET NOCOUNT OFF

Результаты:

IP      Hostname    StartDate       EndDate
1.1.1.1 A       2009-01-10 07:00:00 2009-01-10 07:00:00
1.1.1.1 C       2009-01-09 06:00:00 2009-01-09 06:00:00
1.1.1.1 B       2009-01-07 04:00:00 2009-01-08 05:00:00
1.1.1.1 A       2009-01-01 01:00:00 2009-01-05 03:00:00
...