我想根据特定的标准 Select 一些行,然后从该集合中 Select 一个条目,以及前后的5行.

现在,如果表上有一个主键,我可以用数字表示(例如,主键的数字比目标行的键小5,比目标行的键多5).

因此, Select 主键为7的行和附近的行:

select primary_key from table where primary_key > (7-5) order by primary_key limit 11;

2
3
4
5
6
-=7=-
8
9
10
11
12

但是,如果我只 Select 某些行作为开始,我就失go 了使用主键的数字方法(这是假设键在顺序上没有任何间隙),并且需要另一种方法来获取特定目标行前后最近的行.

这样一个 Select 的主键输出可能看起来更随机,因此不太容易被数学定位所接受(因为一些结果会被过滤掉,例如,使用where active=1):

select primary_key from table where primary_key > (34-5) 
    order by primary_key where active=1 limit 11;

30
-=34=-
80
83
100
113
125
126
127
128
129

注意,由于示例where条件(for example becaseu there are many inactive items)导致主键之间的间隙,我不再得到最接近的上面5和下面5,而是得到最接近的下面1和上面9.

推荐答案

如果用一种编程语言运行两个查询,有很多方法可以做到这一点,但在一个SQL查询中有一种方法可以做到:

(SELECT * FROM table WHERE id >= 34 AND active = 1 ORDER BY id ASC LIMIT 6)
UNION
(SELECT * FROM table WHERE id < 34 AND active = 1 ORDER BY id DESC LIMIT 5)
ORDER BY id ASC

这将返回上面的5行、目标行和下面的5行.

Postgresql相关问答推荐

优化PostgreSQL查询以将用户插入数据库

使用Helm设置PostgreSQL配置

使用psql的copy语句时如何压缩数据?

如何在 kubernetes 中安全地重启 postgresql 容器?

从单选插入到多个表

使用 Heroku CLI、Postgres 的 SQL 语法错误

PG::UndefinedTable:错误:relation "active_storage_blobs" does not exist

Postgres中的GROUP BY - JSON数据类型不相等?

在 postgres 中删除所有共享相同前缀的表

冲突中的 Postgres 会更新复合主键

LAG 函数和 GROUP BY

如何在 PostgreSQL 触发器函数中获取表名?

当记录包含 json 或字符串的混合时,如何防止 Postgres 中的invalid input syntax for type json

为什么 sqlalchemy 的默认列值不起作用

错误:CASE types character varying and numeric cannot be matched

设置 Phoenix 框架和 Ecto 以使用 UUID:如何插入生成的值?

如何启动 Postgres 服务器?

每个数据库提供程序类型允许的最大参数数是多少?

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?