SQL: Нужна формула, которая может просматривать предыдущую строку

#sql #testing #boolean #formula

Вопрос:

У меня есть таблица с 3 столбцами: идентификатор, имя события, Метка времени. Каждая строка таблицы сообщает, въехал ли автомобиль в состав или выехал из него, с соответствующей отметкой времени.

При группировании и упорядочении этой таблицы по идентификатору и имени события в таблице не должно быть 2 последовательных строк с одним и тем же событием. Автомобиль не может дважды въезжать на территорию комплекса или дважды последовательно выезжать из него.

Мне нужна еще одна колонка, которая может проверить, верно это или нет.

 CarID    | EventNAme    | Timestamp
927      | Enter        | 2020-04-30
927      | Exit         | 2020-05-28
906      | Enter        | 2020-11-06
906      | Exit         | 2020-11-26
609      | Enter        | 2021-02-08
609      | Exit         | 2021-02-10
609      | Exit         | 2021-02-10
609      | Enter        | 2021-02-12
900      | Enter        | 2020-11-12
900      | Enter        | 2020-11-18
900      | Exit         | 2020-11-18
 

Поэтому мне нужно написать что-то на SQL таким образом, чтобы результат таблицы был таким, как показано ниже:

 CarID    | EventNAme    | Timestamp    | Test
927      | Enter        | 2020-04-30   | True
927      | Exit         | 2020-05-28   | True
906      | Enter        | 2020-11-06   | True
906      | Exit         | 2020-11-26   | True
609      | Enter        | 2021-02-08   | True
609      | Exit         | 2021-02-10   | True
609      | Exit         | 2021-02-10   | False
609      | Enter        | 2021-02-12   | True
900      | Enter        | 2020-11-12   | True
900      | Enter        | 2020-11-18   | False
900      | Exit         | 2020-11-18   | True
 

С наилучшими пожеланиями,

Лаззанова

Комментарии:

1. Вы просите об LAG() этом .

Ответ №1:

Вы можете использовать lag() :

 select t.*,
       (case when lag(eventname, 1, eventname) over (partition by car order by timestamp) = eventname
             then 'true' else 'false'
        end) as test
from t;
 

Редактировать:

Если параметр по умолчанию не поддерживается вашей базой данных, просто используйте coalesce :

 select t.*,
       (case when coalesce(lag(eventname) over (partition by car order by timestamp), eventname) = eventname
             then 'true' else 'false'
        end) as test
from t;
 

Комментарии:

1. Я получаю сообщение: ОШИБКА: Параметр по умолчанию не поддерживается для задержки функции окна при использовании вашего заявления выше.

2. @Lazzanova . . . Это странно. Это стандартный SQL, и почти все базы данных поддерживают его.