我有一个用户旅行会话表:
CREATE TABLE participants
(
id INT,
session_id INT,
distance DOUBLE PRECISION,
duration DOUBLE PRECISION,
start_time INT,
end_time INT
);
INSERT INTO participants (id, session_id, distance, duration, start_time, end_time)
VALUES (10, 1, 1452.16, 941.989, 115866, 116808),
(10, 3, 2812.62, 1843.658, 116810, 118653),
(10, 9, 91.6784, 33.677, 118689, 118722),
(12, 1, 180.556, 79.839, 118802, 118881),
(12, 3, 355.361, 91.186, 118910, 119001),
(12, 5, 82.0248, 35.989, 119013, 119049),
(12, 7, 5.33002, 6.997, 119055, 119062),
(13, 1, 10583.8, 494.003, 279157, 279651),
(13, 3, 2.22556, 5.02, 279654, 279659),
(13, 5, 67.821, 60.039, 279665, 279725)
SELECT *
FROM participants
LIMIT 5;
id session_id distance duration start_time end_time
10 1 1452.16 941.989 115866 116808
10 3 2812.62 1843.658 116810 118653
10 9 91.6784 33.677 118689 118722
12 1 180.556 79.839 118802 118881
12 3 355.361 91.186 118910 119001
我想要一个新列
stay_time
,用于存储参与者在当前会话之后、新会话开始之前停留的持续时间。显然,这是当前会话的开始时间和上一个会话的结束时间之间的差异吗?
我想创建一个新表,其中包含
participants
表中的所有列和新列(例如:表participants_B
)
必填表(
participants_B
) :
id session_id distance duration start_time end_time stay_time
10 1 1452.16 941.989 115866 116808 0
10 3 2812.62 1843.658 116810 118653 2
10 9 91.6784 33.677 118689 118722 36
12 1 180.556 79.839 118802 118881 0
12 3 355.361 91.186 118910 119001 29
12 5 82.0248 35.989 119013 119049 12
12 7 5.33002 6.997 119055 119062 6
13 1 10583.8 494.003 279157 279651 0
13 3 2.22556 5.02 279654 279659 3
13 5 67.821 60.039 279665 279725 6
lag()
:
select p.*,
start_time - lag(end_time, 1, start_time) over(partition by id order by session_id) stay_time
from participants p
三参数形式在这里很方便;当没有可用的“前一”行时,我们让窗口函数返回
start_time
,它将差异变为0
.
id | session_id | 距离 | 持续时间 | 开始时间 | 结束时间 | 停留时间 |
---|---|---|---|---|---|---|
10 | 1 | 1452.16 | 941.989 | 115866 | 116808 | 0 |
10 | 3 | 2812.62 | 1843.658 | 116810 | 118653 | 2 |
10 | 9 | 91.6784 | 33.677 | 118689 | 118722 | 36 |
12 | 1 | 180.556 | 79.839 | 118802 | 118881 | 0 |
12 | 3 | 355.361 | 91.186 | 118910 | 119001 | 29 |
12 | 5 | 82.0248 | 35.989 | 119013 | 119049 | 12 |
12 | 7 | 5.33002 | 6.997 | 119055 | 119062 | 6 |
13 | 1 | 10583.8 | 494.003 | 279157 | 279651 | 0 |
13 | 3 | 2.22556 | 5.02 | 279654 | 279659 | 3 |
13 | 5 | 67.821 | 60.039 | 279665 | 279725 | 6 |