Postgres Nächste/Vorherige Zeile SQL-Abfrage

Ich haben die folgenden Tabellen in einer PostgreSQL-9.1 Datenbank-aber die ideale Lösung sein sollte, DB-agnostischen, wenn möglich:

Tabelle: Benutzer 
|id|username| 
|1 |ein | 
|2 |zwei | 
|3 |drei | 

Tabelle: Elemente 
|id|userid|itemname|erstellt | 
|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 |ich |timestamp| 

Ich habe eine Abfrage (für eine Ansicht), welche das nächste und das Vorherige Element.id.

z.B.

Anzeigen: UserItems 
|id|userid|itemname|nextitemid|previtemid|erstellt | 
|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 |ich |null |8 |timestamp| 

Ich kann dies mit der folgenden Abfrage:

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;

Können Sie zur Lösung der folgenden Probleme:

1) gibt es eine Möglichkeit, die ids wrap d.h.

  • die NULL itemid in der letzten Zeile der nextitemid Spalte 1
  • die NULL itemid in der ersten Zeile der previtemid Spalte 9

2) gibt es eine leistungsfähige Weise zu der Gruppe der nächsten und vorherigen itemids von userid z.B.

Anmerkung: in diesem Beispiel wird die itemids für einen Benutzer der Reihe nach, dies ist nicht der Fall für die realen Daten, die itemids für jeden Benutzer verschachtelt werden.

Anzeigen: UserItems 
|id|userid|itemname|nextitemid|previtemid|nextuseritemid|prevuseritemid|erstellt | 
|1 |1 |ein|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 |ich|1 |8 |7 |8 |timestamp| 
InformationsquelleAutor davec | 2013-08-17
Schreibe einen Kommentar