如何從主表 GROUPS 中選擇所有記錄,但只從詳細表 SESSIONS 中選擇適當的記錄?
較早的帖子使我相信為此需要一個 LEFT JOIN 子查詢。下面的查詢似乎有效,但僅適用于第一條記錄。后續記錄為 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
從“會話”有條件地回傳單個記錄的規則是:
回傳 current_time 在 session_start 和 session_stop 之間的會話記錄。
否則,如果不存在,則回傳 current_time 小于 session_start 的第一個會話記錄。
不得回傳 current_time 大于 session_stop 的會話。
兩個表,“組”和“會話”:
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
);
分組表內容:
group_id group_name
1 Group 1
2 Group 2
會話表內容:
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
uj5u.com熱心網友回復:
您可以使用ROW_NUMBER()視窗函式sessions為每個選擇 1 行group_id:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420106.html
標籤:
