gpt4 book ai didi

SQL - 获取下一个和上一个 X 记录

转载 作者:行者123 更新时间:2023-11-29 13:49:35 27 4
gpt4 key购买 nike

我正在尝试在 postgresql 中使用一个查询,它可以根据用于某些分页的起始记录 ID 获取上一个和下一个 X 条记录。仅获得 1 个下一个或上一个并不难,但这不是我需要的。

我发现了一些接近的查询,但我对 PostgreSQL 查询的了解还不够多,无法执行这些类型的复杂查询。

下面的这个查询我试过并更改为有效,但似乎只带回 ID 的上一项和下一项以及所有 记录。

但我需要能够给它一个起点,提供一个 ID,例如在 WHERE 子句中,并且只获取 10 个上一个和 10 个下一个记录(如果它们存在)。这可以单独在 sql 中完成吗?

SELECT
m.med_id AS id,
coalesce(
LEAD(m.med_id) OVER (ORDER BY m.med_id DESC),
(select med.med_id from media as med order by med.med_id desc limit 1)
) AS nextitemid,
coalesce(
LAG(m.med_id) OVER (ORDER BY m.med_id DESC),
(select med.med_id from media as med order by med.med_id asc limit 1)
) AS previtemid
FROM media m
WHERE m.post_type = 1
ORDER BY m.med_id DESC LIMIT 20;

任何帮助将不胜感激,它可以是任何类型的 sql 解决方案来完成此任务。

我认为所需的输出来自 100 个项目的示例,其中 50 作为查询中提供的 ID 起点。

|previtemids|nextitemids|
49 51
48 52
47 53
46 54
45 55
44 56
43 57
42 58
41 59
40 60

我已经接近了,但无法在一次查询中得到它。接近我的情况的答案比通用答案更有帮助。

最佳答案

with numbered as(
select your_table.*, row_number() over(order by id) as rn from your_table
)
SELECT previous.id, next.id FROM
(SELECT id, row_number() over(order by id) as inner_rn FROM numbered where rn between (select rn from numbered WHERE id = 12) - 5 and (select rn from numbered WHERE id = 12) -1) previous
INNER JOIN
(SELECT id, row_number() over(order by id) as inner_rn FROM numbered where rn between (select rn from numbered WHERE id = 12) + 1 and (select rn from numbered WHERE id = 12) + 5) next
ON previous.inner_rn = next.inner_rn

如果我正确理解你需要这个

此处 12 是提供 ID 的起点,5 是下一个和上一个 X 记录

(注:比如前一行不是10行,下一行是10行,需要用NULL补漏值,那么用FULL JOIN代替内连接 )

关于SQL - 获取下一个和上一个 X 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43304424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com