跳至內容
Astera Technology

被標記樣本為何丟了真正上一個讀數?

完整歷程先計 LAG,才篩要顯示的行。

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

準備報表輸入

本例被標記樣本要連按 id 真正上一筆讀數。視窗輸入先篩 flagged=1,會刪未標歷程;完整歷程 CTE 先計 LAG,再篩顯示行。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:samples
編號讀數標記旗標
150
281
391
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE samples(id INTEGER PRIMARY KEY,reading INTEGER NOT NULL,flagged INTEGER NOT NULL CHECK(flagged IN(0,1))); INSERT INTO samples VALUES(1,5,0),(2,8,1),(3,9,1);

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT id,reading,LAG(reading) OVER(ORDER BY id) AS previous FROM samples WHERE flagged=1 ORDER BY id;
錯誤查詢的逐行結果
編號讀數上一讀數
28NULL(未知或沒有)
398
下載可編輯 CSV ↓
更正 SELECT
WITH history AS (SELECT *,LAG(reading) OVER(ORDER BY id) AS previous FROM samples) SELECT id,reading,previous FROM history WHERE flagged=1 ORDER BY id;
更正查詢的逐行結果
編號讀數上一讀數
285
398
下載可編輯 CSV ↓

樣本二應上一值五,錯查卻 NULL,因刪了樣本一。樣本三兩邊都正確接樣本二。

用新副本測邊界

首樣本也標記,它真正沒有前一行,所以 NULL;後續上一值仍五、八。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
UPDATE samples SET flagged=1 WHERE id=1;
WITH history AS (SELECT *,LAG(reading) OVER(ORDER BY id) AS previous FROM samples) SELECT id,reading,previous FROM history WHERE flagged=1 ORDER BY id;
邊界查詢的逐行結果
編號讀數上一讀數
15NULL(未知或沒有)
285
398
下載可編輯 CSV ↓

邊界結果哪個 NULL 合理?

查看參考答案

首樣本的上一值 NULL 合理。樣本二真有前一樣本,須顯五。

相關資源