我在 Postgres 9.1 数据库中有以下表结构,但如果可能的话,理想的解决方案应该与数据库无关:
表:用户 |id|用户名| |1 |一个 | |2 |两个 | |3 |三 | 表:项目 |id|userid|项目名|已创建 | |1 |1 |a |时间戳| |2 |1 |b |时间戳| |3 |1 |c |时间戳| |4 |2 |d |时间戳| |5 |2 |e |时间戳| |6 |2 |f |时间戳| |7 |3 |g |时间戳| |8 |3 |h |时间戳| |9 |3 |i |时间戳|
我有一个查询(对于视图),它提供了下一个和上一个 item.id。
例如
查看:用户项 |id|userid|itemname|nextitemid|previtemid|created | |1 |1 |a |2 |null |时间戳| |2 |1 |b |3 |1 |时间戳| |3 |1 |c |4 |2 |时间戳| |4 |2 |d |5 |3 |时间戳| |5 |2 |e |6 |4 |时间戳| |6 |2 |f |7 |5 |时间戳| |7 |3 |g |8 |6 |时间戳| |8 |3 |h |9 |7 |时间戳| |9 |3 |i |null |8 |时间戳|
我可以使用以下查询来做到这一点:
SELECT
DISTINCT i.id AS id,
i.userid AS userid,
i.itemname AS itemname,
LEAD(i.id) OVER (ORDER BY i.created DESC) AS nextitemid,
LAG(i.id) OVER (ORDER BY i.created DESC) AS previtemid,
i.created AS created
FROM items i
LEFT JOIN users u
ON i.userid = u.id
ORDER BY i.created DESC;
您能否帮助解决以下问题:
1)有没有办法让 ids 换行,即
- nextitemid 列最后一行的 NULL itemid 应该是 1
- previtemid 列第一行中的 NULL itemid 应为 9
2) 是否有一种高效的方法可以按用户 ID 对下一个和上一个 itemid 进行分组,例如
注意:在此示例中,用户的 itemid 是连续的,实际数据并非如此,每个用户的 itemid 是交错的。
查看:用户项 |id|userid|itemname|nextitemid|previtemid|nextuseritemid|prevuseritemid|created | |1 |1 |a |2 |9 |2 |3 |时间戳| |2 |1 |b |3 |1 |3 |1 |时间戳| |3 |1 |c |4 |2 |1 |2 |时间戳| |4 |2 |d |5 |3 |5 |6 |时间戳| |5 |2 |e |6 |4 |6 |4 |时间戳| |6 |2 |f |7 |5 |4 |5 |时间戳| |7 |3 |g |8 |6 |8 |9 |时间戳| |8 |3 |h |9 |7 |9 |7 |时间戳| |9 |3 |i |1 |8 |7 |8 |时间戳|