先訂清楚要判斷甚麼,再準備資料
個案可能關閉後再開,不能只因曾有「open」紀錄便當作仍待處理。按時間及固定事件編號挑最新狀態。這份表由首次開案起計,連已關閉的時間也包括;若要計本次重開後等待,起點便不同。
以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。
| 編號 | 開案時間 | 負責人編號 |
|---|---|---|
| E1 | 2026-10-01 09:00 | S1 |
| E2 | 2026-10-08 12:00 | NULL(未知或沒有資料) |
| E3 | 2026-09-01 09:00 | S2 |
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 c.id,c.owner_id,
CAST(julianday('2026-10-10 12:00')-julianday(c.opened_at) AS INTEGER) AS calendar_days
FROM cases c JOIN latest e ON e.case_id=c.id AND e.rn=1
WHERE e.status='open' ORDER BY calendar_days DESC,c.id;| 編號 | 負責人編號 | 完整曆日 |
|---|---|---|
| E1 | S1 | 9 |
| E2 | NULL(未知或沒有資料) | 2 |
E1 現時仍開啟,已過 9 個完整曆日;E2 已過 2 日,而且未有人負責。E3 雖然更早開案,但已關閉,所以不列入。先查看 E1 的處理歷史,並為 E2 分配負責人,再按工作規則跟進。
按資料範圍使用結果
截數時間固定為 2026 年 10 月 10 日中午 12 時,之後的事件不計入。取完整日數不等於工作時數 SLA。若升級處理取決於假期或暫停,亦要訂明時區及停鐘規則。
本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。