對于一個專案,我有一張最近的值作為
| ID | 價值 |
|---|---|
| 1 | 8450 |
| 2 | 8500 |
| 3 | 8550 |
| 4 | 8600 |
| 5 | 8650 |
| 6 | 8700 |
給定一個值,比如 8555,我需要選擇第 2 行和第 3 行,即如下所示。
| ID | 價值 |
|---|---|
| 2 | 8500 |
| 3 | 8550 |
假設值 8601 的另一個示例,所選行應為 4 和 5。
| ID | 價值 |
|---|---|
| 4 | 8600 |
| 5 | 8650 |
uj5u.com熱心網友回復:
使用 SQL 在表中查找值 x 上方和下方的單行。使用 Postgres 13 測驗。
CREATE TABLE example (
id SERIAL PRIMARY KEY,
value INT
);
CREATE INDEX example_asc_idx ON example (value ASC);
CREATE INDEX example_desc_idx ON example (value DESC);
INSERT INTO example (id, value)
VALUES (DEFAULT, 8450),
(DEFAULT, 8500),
(DEFAULT, 8550),
(DEFAULT, 8600),
(DEFAULT, 8700);
WITH above AS (
SELECT *
FROM example
WHERE value > 8555
ORDER BY value ASC
LIMIT 1
), below AS (
SELECT *
FROM example
WHERE value < 8555
ORDER BY value DESC
LIMIT 1
)
SELECT *
FROM above
UNION ALL
SELECT *
FROM below
ORDER BY id;
交替:
SELECT *
FROM example
WHERE id IN ((
SELECT id FROM example
WHERE value > 8555
ORDER BY value ASC
LIMIT 1
),(
SELECT id FROM example
WHERE value < 8555
ORDER BY value DESC
LIMIT 1
))
ORDER BY id;
結果為8555
| ID | 價值 |
|---|---|
| 3 | 8550 |
| 4 | 8600 |
在 DB Fiddle 上查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441831.html
標籤:sql PostgreSQL
