Fensterfunktionen oder allgemeine Tabellenausdrücke: Zählen Sie die vorherigen Zeilen innerhalb des Bereichs

Ich möchte eine Fensterfunktion verwenden, um für jede Zeile die Gesamtzahl der vorhergehenden Datensätze zu bestimmen, die ein bestimmtes Kriterium erfüllen.

Ein konkretes Beispiel:

clone=# \d test
              Table "pg_temp_2.test"
 Column |            Type             | Modifiers 
--------+-----------------------------+-----------
 id     | bigint                      | 
 date   | timestamp without time zone | 

Ich würde gerne für jeden wissendate die Anzahl der Zeilen innerhalb von '1 Stunde vorher'date.

Kann ich das mit einer Fensterfunktion machen? Oder muss ich CTEs untersuchen?

Ich möchte wirklich in der Lage sein, so etwas zu schreiben (funktioniert nicht):

SELECT id, date, count(*) OVER (HAVING previous_rows.date >= (date - '1 hour'::interval))
FROM test;

Ich kann dies wie folgt schreiben, indem ich test gegen sich selbst verbinde. Bei besonders großen Tabellen wird dies jedoch nicht skaliert.

SELECT a.id, a.date, count(b.*)-1 
FROM test a, test b 
WHERE (b.date >= a.date - '1 hour'::interval AND b.date < a.date)
GROUP BY 1,2
ORDER BY 2;

Kann ich das mit einer rekursiven Abfrage machen? Oder ein regulärer CTE? CTEs sind etwas, über das ich noch nicht viel weiß. Ich habe das Gefühl, dass ich es sehr bald tun werde. :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage