我有一個查詢,它按特定的非唯一列對結果進行排序。現在我想獲取N特定 ID(主鍵)之后的第一行。
我有一個類似的表:
| ID | 尺寸 |
|---|---|
| 0 | 3 |
| 1 | 8 |
| 2 | 3 |
| 3 | 3 |
| 4 | 10 |
| 5 | 7 |
現在我按大小(和 ID 以使訂單穩定)排序,如下所示:
SELECT * FROM FOO
ORDER BY Size ASC, ID ASC;
這導致:
| ID | 尺寸 |
|---|---|
| 0 | 3 |
| 2 | 3 |
| 3 | 3 |
| 5 | 7 |
| 1 | 8 |
| 4 | 10 |
現在我想要行之后的前 3 個元素,ID == 2所以結果應該是:
| ID | 尺寸 |
|---|---|
| 3 | 3 |
| 5 | 7 |
| 1 | 8 |
我試過了:
SELECT *
FROM foo
WHERE Size > (SELECT size FROM foo WHERE ID = 2)
ORDER BY Size ASC, ID ASC
LIMIT 3;
這導致:
| ID | 尺寸 |
|---|---|
| 5 | 7 |
| 1 | 8 |
| 4 | 10 |
我也試過:
SELECT *
FROM foo
WHERE Size >= (SELECT size FROM foo WHERE ID = 2)
ORDER BY Size ASC, ID ASC
LIMIT 3;
這導致:
| ID | 尺寸 |
|---|---|
| 0 | 3 |
| 2 | 3 |
| 5 | 7 |
我無法弄清楚如何獲得預期的結果。
uj5u.com熱心網友回復:
使用WHERE帶有子查詢的子句僅考慮大小大于 ID 3 的行:
SELECT *
FROM foo
WHERE size > (SELECT size FROM foo WHERE id = 3)
ORDER BY size ASC
LIMIT 3;
uj5u.com熱心網友回復:
使用ROW_NUMBER()視窗函式:
WITH cte AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Size, ID) rn FROM foo)
SELECT ID, Size
FROM cte
WHERE rn > (SELECT rn FROM cte WHERE ID = 2)
ORDER BY rn LIMIT 3;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/521036.html
