繁体   English   中英

SQL / Postgres:比较行之间的时间戳

[英]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_timeend_time都是时间戳。

我想确实发现涉及同一车次什么vehicle_idstart_time随后的行程中发生在同一日历日或下一个日历日end_time先前的行程。

例如,将返回上面ID为12行,因为:

  • 2start_time1相同的日历日( 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

SQLFiddle: http ://www.sqlfiddle.com/#!12 / 7c92e /5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM