SQL/Postgres:跨行比较时间戳
我有一个名为SQL/Postgres:跨行比较时间戳,sql,postgresql,timestamp,timespan,Sql,Postgresql,Timestamp,Timespan,我有一个名为trips的表,看起来如下: id | vehicle_id | start_time | end_time | ----+------------+---------------------+---------------------+ 1 | 1 | 2014-06-16 22:00:00 | 2014-06-24 03:30:00 | 2 | 1 | 2014-06-24 05:00:00 |
trips
的表,看起来如下:
id | vehicle_id | start_time | end_time |
----+------------+---------------------+---------------------+
1 | 1 | 2014-06-16 22:00:00 | 2014-06-24 03:30:00 |
2 | 1 | 2014-06-24 05:00:00 | 2014-06-28 05:00:00 |
3 | 2 | 2014-06-23 02:00:00 | 2014-06-30 04:00:00 |
...
SQLFiddle:(第9.2页只是因为当时SQLFiddle上的9.3被重载。)
开始时间
和结束时间
都是时间戳
我想做的是查找涉及相同车辆id
的行程,其中后续行程的开始时间
发生在前一行程的结束时间
的同一日历日或下一日历日
例如,将返回上面ID为1
和2
的行,因为:
的2
与开始时间
在同一日历日(1
)进行;及2014-06-24
- 两行具有相同的
车辆id
lag()
函数
select id, vehicle_id, start_time, end_time
from (
select id, vehicle_id, start_time, end_time,
start_time::date - lag(end_time::date) over (partition by vehicle_id order by start_time) as diff_to_prev,
end_time::date - lead(start_time::date) over (partition by vehicle_id order by start_time) as diff_to_next
from trips
) t
where diff_to_prev = 0
or diff_to_next = 0;
“previous”仅在同时提供排序顺序时才有意义。根据您的描述,听起来好像您想使用id
列来确定行的顺序。但如果您可以轻松地将其更改为使用start\u date
该语句计算到下一行和上一行的天数差。如果只取与上一行的差异,则不会返回id为1的行
表达式start\u time::date
只是将时间戳转换为日期以删除时间部分。这也会导致差值为整数值(以天为单位),而不是间隔
SQLFIDLE:非常感谢!我觉得这是正确的方法。不过,我没有得到任何结果:@Aupajo:我认为您希望它按id
排序,这显然是错误的。只需将按id下单
更改为按开始时间下单
,您就会得到id:20,2246925344不知道您为什么期望52975355,因为5297在2014-10-27结束,而5355在2014-10-28开始,这显然不是同一天。太好了,谢谢!我们的目标是找到“在同一个日历日或下一个日历日进行的旅行”-但您已经向我展示了足够多,我可以从这里开始:)谢谢。如果您想包括第二天,您可以将条件更改为diff\u to\u next