在这种情况下,我如何计算参与者的会话时间?

问题描述 投票:0回答:1

我有一个用户旅行会话表:

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

db_fiddle

sql postgresql window-functions
1个回答
1
投票

您可以使用

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.