我无法想出或找到一种方法来查找给定字段中最接近的相邻字段。
例如表:
SELECT chapter, title FROM chapters
ORDER BY chapter ::float
WHERE title = '2';
chapter | title
---------+-------
1 | 2
2 | 2
3 | 2
5 | 2
5.5 | 2
6 | 2
12 | 2
13 | 2
14.5 | 2
假设我想从 中找到相邻字段chapter = '5'。
应该找到顶部5.5和底部3。
我唯一能想到的就是简单地将步长相对于给定值改变+1或-1,但这样我就可以跳过那些相同的5.5或相对于小数的整数。
这种采样在Python项目中是必要的,因此使用它提取此类字段的方法是合适的。
我在 ChatGPT 中发现了一种奇怪但看似有效的方法(出于绝望),但它看起来很可怕、不优雅,而且很可能不可靠。我目前的 SQL 值不足以精确定位和判断。
WITH nearest_chapters AS (
SELECT chapter, title,
LAG(chapter) OVER (ORDER BY chapter::float) AS prev_chapter,
LEAD(chapter) OVER (ORDER BY chapter::float) AS next_chapter
FROM chapters WHERE title = '2'
)
SELECT chapter, title
FROM nearest_chapters
WHERE chapter = '5'
OR prev_chapter = '5'
OR next_chapter = '5';
chapter | title
---------+-------
3 | 2
5 | 2
5.5 | 2
事实上,没有必要通过一个请求来做到这一点。最主要的是找到邻近的值,无论它们是浮点型还是整数型。我的意思是字符串表示形式,因为章节数据类型是 varchar。
要查找先前和后续记录,我们首先需要按顺序号对整个表进行排序。为此,我们将使用窗口函数
ROW_NUMBER():之后一切就很容易了。
请看下文。
数据库小提琴
SQL
结果