2016-08-01 57 views
1

Ich habe eine Tabelle mit mindestens einer "Name" -Spalte und einer "ordinal_position" -Spalte. Ich möchte jede Zeile ab einer bestimmten Zeile die Benutzereingaben wiederholen. Nehmen wir an, der Benutzer gibt "John" ein und dass seine ordinal_position 6 (von insgesamt 10) ist. Wie schleife ich nur die letzten 4 Zeilen, ohne eine Unterabfrage zu verwenden? Ich habe versucht, die "OVER()" -Fensterfunktion zu verwenden, aber es scheint nicht auf den Offset-Teil der Abfrage zu funktionieren, und derselbe Offset nimmt nur Zahlen (soweit ich weiß) keine Zeichenfolgen.Postgres Offset von Wert nicht Nummer

EDIT (als Antwort auf klin):

INSERT INTO foo(id,name,ordinal_position) VALUES 
(DEFAULT,'Peter',1), 
(DEFAULT,'James',2), 
(DEFAULT,'Freddy',3), 
(DEFAULT,'Mark',4), 
(DEFAULT,'Jack',5), 
(DEFAULT,'John',6), 
(DEFAULT,'Will',7), 
(DEFAULT,'Robert',8), 
(DEFAULT,'Dave',9), 
(DEFAULT,'Michael',10); 

so in meinem FOR, da der Benutzer inputed "John" Ich möchte eine Schleife durch Will-Michael. So etwas wie die folgenden, aber ohne Unterabfrage:

SELECT * FROM foo ORDER BY ordinal_position OFFSET 
    (SELECT ordinal_position FROM foo WHERE name='John'); 
+0

Beispieldaten zumindest vor, in Form 'einfügen in my_table Werte ...' – klin

+0

Ohne eine Unterabfrage? Es ist elementar! 'Wählen Sie t1. * von foo als t1 verbinden foo als t2 an (t2.name = 'John' und t1.ordinal_position> t2.ordinal_position);' – Abelisto

+0

Schön! Ich hätte tatsächlich so etwas benutzt, wenn ich nur den Tisch hätte, um den ich mich kümmern müsste, aber ich habe es versäumt, meine gesamte Anfrage zu erklären und aufzuschreiben, da sie viel mehr Bedingungen als die gezeigten hat. Trotzdem danke. –

Antwort

0

Leider haben Sie die Tabelle abzufragen eine ordinal_position für einen bestimmten name zu finden. Verwenden Sie jedoch nicht offset. Sie können es in where Klausel, für große Tabellen wird es viel schneller sein:

select * 
from foo 
where ordinal_position > (select ordinal_position from foo where name = 'John') 
order by ordinal_position; 

id | name | ordinal_position 
----+---------+------------------ 
    7 | Will |    7 
    8 | Robert |    8 
    9 | Dave |    9 
10 | Michael |    10 
(4 rows)