You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL关联多表时获取非空mode的每个session_id最后记录

解决方案

首先给出两张表的结构及插入数据:

CREATE TABLE labels(user_id INT, session_id INT, start_time TIMESTAMP, mode TEXT);
INSERT INTO labels (user_id, session_id, start_time, mode)
VALUES (48, 652, '2016-04-01 00:47:00', 'foot'),
       (46, 663, '2016-04-01 00:13:00', 'car'),
        (9, 658, '2016-04-01 00:45:19', '');

CREATE TABLE session(session_id INT, timestamp TIMESTAMP, speed DOUBLE PRECISION);
INSERT INTO session(session_id, timestamp, speed)
VALUES (652, '2016-04-01 00:47:00', 0.77), (652, '2016-04-01 00:53:00', 3.57), (652, '2016-04-01 01:04:00', 1.25),
       (663, '2016-04-01 00:13:00', 2.5), (663, '2016-04-01 00:20:00', 12.5),
        (658, '2016-04-01 00:45:19', 2.5), (658, '2016-04-01 00:50:19', 5.3), (658, '2016-04-01 01:15:19', 7.6);

原查询可返回session_id关联且mode不为空的两张表连接结果:

SELECT l.user_id, l.session_id, l.start_time, l.mode,  s.timestamp
FROM labels l
JOIN session s
 ON l.session_id = s.session_id
WHERE l.mode = '' IS NOT TRUE

要实现仅返回mode不为空的每个session_id对应的最后一条timestamp(命名为end_time),可以先对session表按session_id分组,取每组最大的timestamp作为end_time,再和labels表关联并过滤mode不为空的记录。修改后的查询如下:

SELECT l.user_id, l.session_id, l.start_time, l.mode, s.end_time
FROM labels l
JOIN (
    SELECT session_id, MAX(timestamp) AS end_time
    FROM session
    GROUP BY session_id
) s ON l.session_id = s.session_id
WHERE l.mode <> '';

预期输出

user_id session_id   start_time         mode         end_time
 48        652      2016-04-01 00:47:00 foot    2016-04-01 01:04:00
 46        663      2016-04-01 00:13:00  car    2016-04-01 00:20:00

内容的提问来源于stack exchange,提问作者Amina Umar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:56:01