[英]SQL/Postgres: comparing timestamps across rows
我有一个名为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 |
...
SQL Fiddle: http ://www.sqlfiddle.com/#!12 / 7c92e / 1 (PG 9.2,仅因为9.3在SQL Fiddle上的时间很重。)
start_time
和end_time
都是时间戳。
我想确实发现涉及同一车次什么vehicle_id
在start_time
随后的行程中发生在同一日历日或下一个日历日end_time
先前的行程。
例如,将返回上面ID为1
和2
行,因为:
2
的start_time
与1
相同的日历日( 2014-06-24
)发生; 和 vehicle_id
这很可能在SQL中不明智。 欢迎提供任何有关Postgres功能的建议,技巧或指针。
可以使用窗口函数来访问“上一个”行中的值 。 在这种情况下, 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;
仅当您还提供排序顺序时,“上一个”才有意义。 从您的描述中听起来好像您想使用id
列来确定行的顺序。 但是,如果您可以轻松地将其更改为使用start_date
。
该语句计算到下一行和上一行的天数差异。 如果仅采用与前一个的区别,则不会返回id=1
的行。
表达式start_time::date
只是将时间戳转换为日期以删除时间部分。 这还具有这样的效果,即差异是整数值(以天为单位),而不是interval
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.