Überspringen Sie jedes N-te Ergebniszeile in PostgreSQL
Ich bin auf der Suche nach einer Möglichkeit zum überspringen von Zeilen in PostgreSQL.
Zwei Möglichkeiten, wie ich könnte dies tun, werden Verwendung:
SELECT * FROM table WHERE id % 5 = 0
Aber ich würde Holen müssen sequentiell Zeilen richtig überspringen. Zum Beispiel, wenn ich fetch row (mit ids) 0,3,5,
es würde nicht überspringen 4 out of 5 Zeilen, sondern führen (ids) 0 und 5.
Oder überspringen Sie außerhalb von SQL:
$count = 0;
while($row = progres_fetch_row($result))
if ($count++ % 5 == 0)
// do something
Was ist der Schnellste Weg, um jede N-te Zeile aus einer SQL-Datenbank?
- ProgreSQL, wie im ersten Satz, aber ich bin auch neugierig, für MySQL.
- Du meinst, PostgreSQL, oder wird es einen separaten RDBMS-ich bin mir nicht bewusst?
- es scheint, die Tippfehler in den Kommentaren aber sehr erste Zeile in der OP sagt "ich bin auf der Suche nach einem Weg, überspringen Sie die Zeilen in (Prostgre)von SQL" so ist es PostgreSQL. aber er ist auch daran interessiert, MySQL-Lösung.
- Ja, sorry, my bad. Ich kann nicht ändern, den Kommentar, mehr obwohl. Es ist PostgreSQL, die mich am meisten interessiert.
What is the fastest way to get every nth row from a SQL database?
Wahrscheinlich mit Fenster-Funktionen, aber die meisten effiziente Umsetzung wird natürlich stark davon abhängen, die genaue Struktur der Tabelle(N) in Frage.- "Aber ich würde Holen müssen sequentiell Zeilen richtig überspringen. Zum Beispiel, wenn ich fetch row (mit ids) 0,3,5, würde es nicht überspringen 4 out of 5 Zeilen, sondern führen (ids) 0 und 5." ich hatte nicht diese. können Sie näher erläutern, was sind die Basis-Zeilen, was Sie abrufen und wie funktioniert % - operator nicht in Ihrem Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie PostgreSQL verwenden, können Sie
row_number()
:Wenn n groß genug ist (wie 1000), kann man sich überlegen, MIT REKURSIVEN Anfragen wie:
limit 1
Schließung der CTE. So haben Sie entweder eine CTE gekennzeichnetrecursive
dass ist nicht rekursiv, oder Sie haben eine ungültige CTE. Aber selbst wenn Sie Ihre Klammern, rechts, würden Sie wind-up mit "LIMIT in a recursive query ist nicht implementiert". Und selbst wenn, dass würde arbeiten, ich bezweifle, dass das effizienter ist, die mit einer Fenster-Funktion (und Sie würden nicht wirklich benötigen die verschachtelten WÄHLEN Sie im rekursiven Teil, um mit zu beginnen). So wie es da steht, deine Antwort ist schlichtweg falsch (und nicht arbeiten)Hier ist eine generische und wahrscheinlich ganz langsam die Lösung in Fall, dass Sie nicht haben, Zugang zu den ranking-Funktionen, wie
row_number()
. Also in MySQL, würden Sie schreiben:Wenn Sie hinzufügen möchten zusätzliche Prädikate, nur sicher sein, um Sie hinzuzufügen, um sowohl äußere als auch innere Abfrage:
Anmerkungen:
ORDER BY
Klausel