準備報表輸入
本例每份工作清單最多兩項,優先由高至低,再按 id。全局 LIMIT2 只取整體兩項。每份工作清單內 ROW_NUMBER 才套嚴格名額及相同優先時固定取法。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 | 工作清單 | 優先值 |
|---|---|---|
| A | North | 9 |
| B | North | 8 |
| C | North | 1 |
| D | South | 7 |
| E | South | 6 |
| F | South | 5 |
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 queue,id,priority FROM items ORDER BY priority DESC,id LIMIT 2;| 工作清單 | 編號 | 優先值 |
|---|---|---|
| North | A | 9 |
| North | B | 8 |
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;| 工作清單 | 編號 | 優先值 |
|---|---|---|
| North | A | 9 |
| North | B | 8 |
| South | D | 7 |
| South | E | 6 |
錯誤只有 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;| 工作清單 | 編號 | 優先值 |
|---|---|---|
| North | A | 9 |
| North | B | 8 |
| South | D | 7 |
| South | E | 6 |
邊界同分會令 North 可取三項嗎?
查看參考答案
不會,嚴格兩項,所以仍 A、B,加 South D、E。