Получите следующую запись в запросе - PullRequest
1 голос
/ 09 июля 2020

Если у нас есть таблица с именем Activity и строки [ActivityCode и StartTime], например

ActivityCode-----StartTime<BR>
Lunch------------1200<BR>
MathClass--------1300<BR>
EnglishClass-----1500<BR>
EndOfSchool------1700<BR>

И теперь я хочу сделать один SQL Запрос, который будет отображаться следующим образом:

ActivityCode-----StartTime-----EndTime<BR>
Lunch------------1200----------1300<BR>
MathClass--------1300----------1500<BR>
EnglishClass-----1500----------1700<BR>
EndOfSchool------1700----------1700<BR>

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

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Я бы использовал подзапрос с агрегацией:

select a.*,
       (select nz(min(a2.starttime), a.endtime)
        from activity as a2
        where a2.starttime > a.starttime
       ) as endtime
from activity as a;

Обычно в таком примере должен быть дополнительный столбец, идентифицирующий какую-то «группировку» - например, человека. Если у вас есть такой столбец, у вас будет условие равенства в подзапросе, а также неравенство по времени.

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

1 голос
/ 09 июля 2020

Вы можете использовать этот запрос:

SELECT 
    Activity.ActivityCode, 
    Activity.StartTime, 
    Nz((Select Top 1 StartTime 
        From Activity As T 
        Where T.StartTime > Activity.StartTime 
        Order By StartTime Asc),
        [StartTime]) AS EndTime, 
    CDate(TimeSerial(Val([EndTime])\100,Val([EndTime]) Mod 100,0)-
        TimeSerial(Val([StartTime])\100,Val([StartTime]) Mod 100,0)) AS Duration
FROM 
    Activity;

Вывод:

Вывод

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