Получить следующую строку в SQL - PullRequest
1 голос
/ 05 августа 2010

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

|-LogonDate---|-PersonID-|-LoggedOnTime---|   
|5/30 12:00pm |100       |3600            | 
|5/30 01:00pm |100       |3430            |
|5/30 03:30pm |100       |3000            |

SELECT PersonID, LogonDate, LoggedOnTime
FROM Agent_Logout

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Вы можете использовать дополнительный выбор, чтобы получить следующую LogonDate, а затем определить разницу между ними.

SELECT
    a.PersonID,
    a.LogonDate,
    a.LoggedOnTime,
    (SELECT b.LogonDate
     FROM Agent_Logout AS b
     WHERE b.LogonDate > a.LogonDate
     ORDER BY b.LogonDate ASC
     LIMIT 1) AS NextLogonDate
FROM Agent_Logout AS a

При использовании MS SQL Server удалите LIMIT 1 и добавьте TOP 1 здесь: SELECT TOP 1 b.LogonDate

РЕДАКТИРОВАТЬ: Спасибо @JYelton за указание TOP 1 для MS SQL Server и ORDER BY b.LogonDate ASC

0 голосов
/ 06 августа 2010

Это возможно с аналитической функцией.Не знаю, какую СУБД вы используете, но Oracle и я думаю, что SQL Server может это сделать.Я сделал это однажды в Oracle.Есть отличная сторона, объясняющая это здесь Я всегда хожу туда, когда мне нужны эти аналитические функции (обычно это скорее RANK).Вам понадобится функция под названием LEAD.Я думаю, что это будет работать так:

SELECT PersonID, LogonDate, LoggedOnTime
       LEAD(LoggedOnTime, 1, 0) OVER (PARTITION BY PersonID ORDER BY LogonDate, LoggedOnTime)
FROM Agent_Logout

Дайте мне знать, если это не работает, как вы хотите (потому что я не проверял это).Затем я постараюсь пойти и заставить его работать.Но я очень уверен ... если ваша база данных допускает синтаксис.

...