Select 来自主 table 的所有记录,但有条件地只有一条来自细节 table

Select all records from master table, but conditionally only one from detail table

如何select master table GROUPS 中的所有记录,但只有详细 table SESSIONS 中的适当记录?

较早的帖子使我相信为此需要一个 LEFT JOIN 子查询。 下面的查询似乎有效,但仅适用于第一条记录。 后续记录 return session_start 等的 NULL 值

如何获取所有组记录的会话数据?

SELECT g.group_id, g.group_name
  FROM groups g

LEFT JOIN (
   SELECT session_id,
          group_id,
          session_start,
          session_stop
     FROM sessions
    WHERE :current_time < session_stop
 ORDER BY :current_time BETWEEN session_start AND session_stop DESC,
          session_stop
    LIMIT 1 ) s
ON s.group_id = g.group_id

有条件地 return 从“会话”获取单个记录的规则是:

  1. Return current_time 位于 session_start 和 session_stop 之间的会话记录。

  2. 否则,如果 none 存在,return 第一个会话记录 current_time 小于 session_start。

  3. current_time 大于 session_stop 的会话不得 returned。

两个 table,“组”和“会话”:

CREATE TABLE groups (
    group_id   INTEGER PRIMARY KEY AUTOINCREMENT,
    group_name VARCHAR UNIQUE ON CONFLICT IGNORE
);

CREATE TABLE sessions (
    session_id      INTEGER PRIMARY KEY AUTOINCREMENT,
    group_id        INTEGER REFERENCES groups (group_id) ON DELETE CASCADE,
    session_start   REAL,
    session_stop    REAL
);

组table内容:

group_id    group_name
1           Group 1
2           Group 2

场次table内容:

session_id  group_id    session_start   session_stop
1       1               2459603.875     2459604.2291666665
2       1               2459604.875     2459605.2291666665
3       1               2459605.875     2459606.2291666665
261     2               2459603.875     2459604.2291666665
262     2               2459604.875     2459605.2291666665
263     2               2459605.875     2459606.2291666665

您可以使用 ROW_NUMBER() window 函数从 sessions 中为每个 group_id 选择 1 行:

SELECT g.*, s.*
FROM groups g
LEFT JOIN (
  SELECT *, ROW_NUMBER() OVER (
              PARTITION BY group_id
              ORDER BY julianday('now','localtime') BETWEEN session_start AND session_stop DESC,
                       session_start 
            ) rn
  FROM sessions
  WHERE julianday('now','localtime') <= session_stop
) s ON s.group_id = g.group_id AND s.rn = 1;