跳至內容
Astera Technology

每份工作清單取兩項,為何結果只得一組?

用分區排名套各工作清單嚴格名額。

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

準備報表輸入

本例每份工作清單最多兩項,優先由高至低,再按 id。全局 LIMIT2 只取整體兩項。每份工作清單內 ROW_NUMBER 才套嚴格名額及相同優先時固定取法。

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

假設輸入:items
編號工作清單優先值
ANorth9
BNorth8
CNorth1
DSouth7
ESouth6
FSouth5
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE items(id TEXT PRIMARY KEY,queue TEXT NOT NULL,priority INTEGER NOT NULL); INSERT INTO items VALUES('A','North',9),('B','North',8),('C','North',1),('D','South',7),('E','South',6),('F','South',5);

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT queue,id,priority FROM items ORDER BY priority DESC,id LIMIT 2;
錯誤查詢的逐行結果
工作清單編號優先值
NorthA9
NorthB8
下載可編輯 CSV ↓
更正 SELECT
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY queue ORDER BY priority DESC,id) AS place FROM items) SELECT queue,id,priority FROM ranked WHERE place<=2 ORDER BY queue,priority DESC,id;
更正查詢的逐行結果
工作清單編號優先值
NorthA9
NorthB8
SouthD7
SouthE6
下載可編輯 CSV ↓

錯誤只有 North A/B,更正也有 South D/E。本例相同優先時用較低 id,把名額維持兩項。

用新副本測邊界

North C 改八與 B 同分,id 規則仍用 B 作第二位,North 仍只兩項。

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

邊界改動及更正查詢
UPDATE items SET priority=8 WHERE id='C';
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY queue ORDER BY priority DESC,id) AS place FROM items) SELECT queue,id,priority FROM ranked WHERE place<=2 ORDER BY queue,priority DESC,id;
邊界查詢的逐行結果
工作清單編號優先值
NorthA9
NorthB8
SouthD7
SouthE6
下載可編輯 CSV ↓

邊界同分會令 North 可取三項嗎?

查看參考答案

不會,嚴格兩項,所以仍 A、B,加 South D、E。

相關資源