先準備用來排查的資料
客戶可以預先登記將來地址。資料庫最後一筆未必是 10 月 10 日適用的地址。先限制生效日不遲於截數日,再排最新版本,不能倒過來先取最新一筆才想日期。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 編號 | 客戶 | 生效日 | 假設地址 |
|---|---|---|---|
| 1 | C1 | 2026-01-01 | Demo Unit A |
| 2 | C1 | 2026-11-01 | Demo Unit B |
CREATE TABLE addresses(id INTEGER PRIMARY KEY,customer TEXT,valid_from TEXT,address TEXT);
INSERT INTO addresses VALUES (1,'C1','2026-01-01','Demo Unit A'),(2,'C1','2026-11-01','Demo Unit B');重現錯誤結果,再核對更正
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY customer ORDER BY valid_from DESC,id DESC) AS rn FROM addresses)
SELECT customer,address FROM ranked WHERE rn=1 ORDER BY customer;| 客戶 | 假設地址 |
|---|---|
| C1 | Demo Unit B |
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY customer ORDER BY valid_from DESC,id DESC) AS rn
FROM addresses WHERE valid_from<='2026-10-10')
SELECT customer,address FROM ranked WHERE rn=1 ORDER BY customer;| 客戶 | 假設地址 |
|---|---|
| C1 | Demo Unit A |
直接選最新會用 11 月 1 日的 Demo Unit B;更正後是 1 月已生效的 Demo Unit A。查詢只供覆核,未授權寄貨,也未驗證地址能收件。
套用前先測邊界及資料範圍
加入剛好 10 月 10 日生效的 Demo Unit C,按起日包含規則,當天用 C;同日先後則按本例版本編號處理。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO addresses VALUES (3,'C1','2026-10-10','Demo Unit C');| 客戶 | 假設地址 |
|---|---|
| C1 | Demo Unit C |
未設失效日、地址類別或時區;沒有適用地址的客戶須暫停覆核,不能退而用將來地址。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。