先訂清楚要判斷甚麼,再準備資料
先找每個個案的最新事件,再查之前有沒有結案紀錄。同一時間有兩筆事件時,用事件編號定先後。若個案重開後已再次關閉,便不應繼續出現在「現時重開」清單。
以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。
| 編號 | 個案編號 | 事件時間 | 狀態代碼 |
|---|---|---|---|
| 1 | E1 | 2026-10-01 09:00 | open |
| 2 | E1 | 2026-10-05 09:00 | closed |
| 3 | E1 | 2026-10-09 09:00 | open |
| 4 | E2 | 2026-10-08 12:00 | open |
| 5 | E3 | 2026-09-01 09:00 | open |
| 6 | E3 | 2026-10-02 09:00 | closed |
CREATE TABLE cases(id TEXT PRIMARY KEY, opened_at TEXT, owner_id TEXT);
CREATE TABLE case_events(id INTEGER PRIMARY KEY, case_id TEXT, occurred_at TEXT, status TEXT);
INSERT INTO cases VALUES ('E1','2026-10-01 09:00','S1'),('E2','2026-10-08 12:00',NULL),('E3','2026-09-01 09:00','S2');
INSERT INTO case_events VALUES (1,'E1','2026-10-01 09:00','open'),(2,'E1','2026-10-05 09:00','closed'),(3,'E1','2026-10-09 09:00','open'),(4,'E2','2026-10-08 12:00','open'),(5,'E3','2026-09-01 09:00','open'),(6,'E3','2026-10-02 09:00','closed');執行查詢,核對實際結果
WITH latest AS (
SELECT *,ROW_NUMBER() OVER (PARTITION BY case_id ORDER BY occurred_at DESC,id DESC) AS rn
FROM case_events WHERE occurred_at<='2026-10-10 12:00'
)
SELECT e.case_id,e.occurred_at AS reopened_at FROM latest e
WHERE e.rn=1 AND e.status='open'
AND EXISTS (SELECT 1 FROM case_events old WHERE old.case_id=e.case_id
AND old.status='closed' AND (old.occurred_at<e.occurred_at
OR (old.occurred_at=e.occurred_at AND old.id<e.id)))
ORDER BY e.case_id;| 個案編號 | 最新重開時間 |
|---|---|
| E1 | 2026-10-09 09:00 |
只有 E1 符合:10 月 5 日曾結案,最新在 10 月 9 日上午 9 時重新開啟。E2 從未結案;E3 的最新狀態是已關閉。覆核時比較 E1 的重開原因和上次處理,不能單憑重開便判定同一問題再發生。
按資料範圍使用結果
例子只有開啟及關閉兩種狀態。若有等待、取消或重複個案,須先訂狀態轉移規則。最新 open 時間是最新事件,未必是連續多筆開啟事件中的第一刻。
本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。