Wählen Sie, bis die Zeile in postgresql? @ Übereinstimm
Gibt es eine Möglichkeit, Zeilen auszuwählen, bis eine Bedingung erfüllt ist? Das heißt Eine Art vonlimit
, aber nicht beschränkt aufN
Zeilen, aber auf alle Zeilen bis zur ersten nicht übereinstimmenden Zeile?
Sagen Sie zum Beispiel, ich habe die Tabelle:
CREATE TABLE t (id SERIAL PRIMARY KEY, rank INTEGER, value INTEGER);
INSERT INTO t (rank, value) VALUES ( 1, 1), (2, 1), (2,2),(3,1);
das ist
test=# SELECT * FROM t;
id | rank | value
----+------+-------
1 | 1 | 1
2 | 2 | 1
3 | 2 | 2
4 | 3 | 1
(4 rows)
Ich möchte nach Rang ordnen und bis zur ersten Zeile, die über 1 liegt, auswählen.
D.SELECT * FROM t ORDER BY rank UNTIL value>1
und ich möchte die ersten 2 Zeilen zurück?
Eine Lösung besteht darin, eine Unterabfrage zu verwenden undbool_or
:
SELECT * FROM
( SELECT id, rank, value, bool_and(value<2) OVER (order by rank, id) AS ok FROM t ORDER BY rank) t2
WHERE ok=true
Aber wird das nicht durch alle Zeilen gehen, auch wenn ich nur eine Handvoll will?
(Kontext der realen Welt: Ich habe zeitgestempelte Ereignisse in einer Tabelle. Ich kann eine Fensterabfrage verwenden, um die Zeit zwischen zwei Ereignissen auszuwählen. Ich möchte alle Ereignisse vonnow
gehen zurück, solange sie weniger als 10 Minuten voneinander entfernt passiert sind - dielead/lag
Fenster Abfrage erschwert die Dinge, so vereinfachtes Beispiel hier)
edit: Fensterfunktion wurde von @ geordnrank, id