如何引用查询中的上一行和下一行,以及当前的?
我有一张桌子记录从A到B的汽车旅程。结构与此类似......
CREATE TABLE journeys (
journeyID SERIAL,
vehicleId CHAR(15),
startTime TIMESTAMP,
endTime TIMESTAMP
);
每一行代表一次旅程,我怎样才能找到一个旅程结束和下一个旅程开始之间的周转时间?
对于每个旅程,我希望能够引用前一行(按时间顺序排序)以建立CURR.startTime - PREV.endTime。注意 - journeyId不是顺序的,也不是按时间顺序排列的。
我尝试过自联接到同一个表的副本,但因为我无法唯一地识别后续行程,所以我最终会得到一个返回大量结果的产品查询。
(我正在使用PostGres,但如果可能的话,我更喜欢ANSI SQL解决方案)
Aaron的附录 - 我正试图获得两个记录之间的时间间隔,如果一个特定车辆ID的一个旅程结束于中午12点(结束时间),随后的旅程(对于同一车辆)从12开始:45(startTime),然后两者之间的时间间隔为45分钟。
答案 0 :(得分:1)
您需要使用LAG()
访问上一行的endTime
。大多数DBMS都提供LAG()
和类似的窗口函数(将进入MySQL 8.0)。
您的查询将如下所示:
SELECT journeyID, vehicleID, startTime, endTime,
startTime - LAG(endTime) over (PARTITION BY vehicleID ORDER BY startTime ASC) as timeBetweenJourneys
FROM journeys