跳至內容
Astera Technology

今天出貨,報表為甚麼用了下月地址?

先排除尚未生效地址,再選截數日適用的最新一筆。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

客戶可以預先登記將來地址。資料庫最後一筆未必是 10 月 10 日適用的地址。先限制生效日不遲於截數日,再排最新版本,不能倒過來先取最新一筆才想日期。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:addresses
編號客戶生效日假設地址
1C12026-01-01Demo Unit A
2C12026-11-01Demo Unit B
下載可編輯 CSV ↓
可直接執行的完整測試資料
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;
實際執行的錯誤示範結果
客戶假設地址
C1Demo Unit B
下載可編輯 CSV ↓
更正後的 SQLite 查詢
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;
更正查詢的實際結果
客戶假設地址
C1Demo Unit A
下載可編輯 CSV ↓

直接選最新會用 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');
改動後再執行更正查詢的實際結果
客戶假設地址
C1Demo Unit C
下載可編輯 CSV ↓

未設失效日、地址類別或時區;沒有適用地址的客戶須暫停覆核,不能退而用將來地址。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源