跳至內容
Astera Technology

報表是最新日期,為甚麼單價卻是舊的?

選出完整一筆價格紀錄,避免把不同欄位最大值拼成不存在的資料。

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

先準備用來排查的資料

本例要找已提供價格歷史的最後一筆。最大生效日期與最高單價是兩個獨立計算。價格下調時,兩個最大值可能來自不同紀錄,拼起來雖各有來源,整筆卻不是真的。

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

假設輸入:prices
編號貨品編號生效日單價(分)
1A2026-09-012000
2A2026-10-011500
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE prices(id INTEGER PRIMARY KEY,sku TEXT,valid_from TEXT,unit_cents INTEGER);
INSERT INTO prices VALUES (1,'A','2026-09-01',2000),(2,'A','2026-10-01',1500);

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
SELECT sku,MAX(valid_from) AS valid_from,MAX(unit_cents) AS unit_cents FROM prices GROUP BY sku ORDER BY sku;
實際執行的錯誤示範結果
貨品編號生效日單價(分)
A2026-10-012000
下載可編輯 CSV ↓
更正後的 SQLite 查詢
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY sku ORDER BY valid_from DESC,id DESC) AS rn FROM prices)
SELECT sku,valid_from,unit_cents FROM ranked WHERE rn=1 ORDER BY sku;
更正查詢的實際結果
貨品編號生效日單價(分)
A2026-10-011500
下載可編輯 CSV ↓

10 月價格是 1500 分,2000 分屬 9 月。錯誤查詢把 10 月與 2000 分並列。按日期及版本編號選完整一行,才能保留當時真正的單價。

套用前先測邊界及資料範圍

同日再加入編號 3、價格 1400 的版本。本例訂明較大編號是後修訂,所以選它;若沒有已確認的先後規則,同日不同價須交人覆核。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO prices VALUES (3,'A','2026-10-01',1400);
改動後再執行更正查詢的實際結果
貨品編號生效日單價(分)
A2026-10-011400
下載可編輯 CSV ↓

假設所有行都已發布可供選取;未來排程及客戶特定價格須另加適用條件。

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

相關資源