跳至內容
Astera Technology

哪些例外個案結案後又重新開啟?

找出目前仍開啟,而且曾經結案的個案,供同事查原因是否已真正解決。

先訂清楚要判斷甚麼,再準備資料

先找每個個案的最新事件,再查之前有沒有結案紀錄。同一時間有兩筆事件時,用事件編號定先後。若個案重開後已再次關閉,便不應繼續出現在「現時重開」清單。

以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。

假設輸入節錄;完整相關資料見下方 SQL
編號個案編號事件時間狀態代碼
1E12026-10-01 09:00open
2E12026-10-05 09:00closed
3E12026-10-09 09:00open
4E22026-10-08 12:00open
5E32026-09-01 09:00open
6E32026-10-02 09:00closed
下載可編輯 CSV ↓
可直接執行的完整假設資料(SQLite)
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');

執行查詢,核對實際結果

SQLite 唯讀查詢
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;
以上 SQLite 假設資料的查詢結果
個案編號最新重開時間
E12026-10-09 09:00
下載可編輯 CSV ↓

只有 E1 符合:10 月 5 日曾結案,最新在 10 月 9 日上午 9 時重新開啟。E2 從未結案;E3 的最新狀態是已關閉。覆核時比較 E1 的重開原因和上次處理,不能單憑重開便判定同一問題再發生。

按資料範圍使用結果

例子只有開啟及關閉兩種狀態。若有等待、取消或重複個案,須先訂狀態轉移規則。最新 open 時間是最新事件,未必是連續多筆開啟事件中的第一刻。

本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。

相關資源