sql - 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
亲切的问候,
拉扎诺娃
解决方案
您可以使用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;
推荐阅读
- javascript - 由 fancybox 插入的 AngularJS DOM 无法识别“{{}}”插值
- postgresql - pgBouncer - 2k 内存优化
- asp.net - ASP.NET 和 SSAS
- windows - 程序运行时无法从 mpg123 捕获诊断输出
- tomcat - 如何在tomcat的日志文件中停止DEBUG消息
- flink-streaming - 端到端完全一次示例代码
- javascript - 如何使用javascript添加当前月份日期作为html表中每个单独列的标题?
- android - 半透明状态栏在导航抽屉上保持半透明阴影
- javascript - 在一个 html 表格单元格中分层多个图像
- python - 如何使用python获取当前迭代循环列表的行