我有一个Postgres 9.1数据库,其中包含以下表结构,但最理想的解决方案应该是DB可移植的(如果可能的话):
Table: users |id|username| |1 |one | |2 |two | |3 |three |
Table: items |id|userid|itemname|created | |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。
例如:
View: UserItems |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)有没有办法使id换行,即
- 下一个项目ID列中最后一行的NULL itemid应该是1
- 前一个项目ID列中第一行的NULL itemid应该是9
2)是否有一种高效的方法按userid分组next和previous itemids,例如
NB:在此示例中,用户的itemids是连续的,但在实际数据中并非如此,每个用户的itemids是交错的。
视图:UserItems | id | userid | itemname | nextitemid | previtemid | nextuseritemid | prevuseritemid | created | | 1 | 1 | a | 2 | 9 | 2 | 3 | timestamp | | 2 | 1 | b | 3 | 1 | 3 | 1 | timestamp | | 3 | 1 | c | 4 | 2 | 1 | 2 | timestamp | | 4 | 2 | d | 5 | 3 | 5 | 6 | timestamp | | 5 | 2 | e | 6 | 4 | 6 | 4 | timestamp | | 6 | 2 | f | 7 | 5 | 4 | 5 | timestamp | | 7 | 3 | g | 8 | 6 | 8 | 9 | timestamp | | 8 | 3 | h | 9 | 7 | 9 | 7 | timestamp | | 9 | 3 | i | 1 | 8 | 7 | 8 | timestamp |