首页 > 解决方案 > SQL:需要一个可以查看前一行的公式

问题描述

我有一个包含 3 列的表:CarID、EventName、Timestamp。表格的每一行都告诉汽车是否进入或离开了一个大院,并带有相应的时间戳。

当按 CarID 和 EventName 对该表进行分组和排序时,该表不应有 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

亲切的问候,

拉扎诺娃

标签: sqltestingbooleanformula

解决方案


您可以使用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;

推荐阅读