Tôi đã cấu trúc bảng sau đây trong một cơ sở dữ liệu Postgres 9.1 nhưng giải pháp lý tưởng nên DB thuyết bất khả tri nếu có thể:Postgres Tiếp theo/Trước hàng SQL Query
Table: users |id|username| |1 |one | |2 |two | |3 |three | Table: items |id|userid|itemname|created | |1 |1 |a |timestamp| |2 |1 |b |timestamp| |3 |1 |c |timestamp| |4 |2 |d |timestamp| |5 |2 |e |timestamp| |6 |2 |f |timestamp| |7 |3 |g |timestamp| |8 |3 |h |timestamp| |9 |3 |i |timestamp|
Tôi có một truy vấn (đối với một cái nhìn) mà cung cấp mục tiếp theo và trước đó.id.
ví dụ:
View: UserItems |id|userid|itemname|nextitemid|previtemid|created | |1 |1 |a |2 |null |timestamp| |2 |1 |b |3 |1 |timestamp| |3 |1 |c |4 |2 |timestamp| |4 |2 |d |5 |3 |timestamp| |5 |2 |e |6 |4 |timestamp| |6 |2 |f |7 |5 |timestamp| |7 |3 |g |8 |6 |timestamp| |8 |3 |h |9 |7 |timestamp| |9 |3 |i |null |8 |timestamp|
tôi có thể làm điều này với các truy vấn sau đây:
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;
Bạn có thể giúp giải quyết các vấn đề sau:
1) Có cách nào để làm cho id quấn tức
- mục NULL trong hàng cuối cùng của cột nextitemid phải là 1
- mục NULL trong hàng đầu tiên của cột previtemid phải là 9
2) có cách thực hiện để nhóm các mục tiếp theo và trước đó bởi userid ví dụ:
NB: trong ví dụ này các itemid cho người dùng là tuần tự, đây không phải là trường hợp cho dữ liệu thực, các itemid cho mỗi người dùng được xen kẽ.
View: 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|
+1 cho first_value và last_value :) –
Đó là mẹo độc đáo, cảm ơn rất nhiều chàng trai. Bạn có thể xóa chú thích chưa được kiểm tra quá http://sqlfiddle.com/#!1/58d92/28 – davec