Filtern nach Fensterfunktion führt zu Postgresql

Ok, anfangs war nur ein Scherz wir hatten uns mit einem Freund von mir, aber es stellte sich in interessante technische Frage 🙂

Habe ich Folgendes stuff Tabelle:

CREATE TABLE stuff
(
    id serial PRIMARY KEY,
    volume integer NOT NULL DEFAULT 0,
    priority smallint NOT NULL DEFAULT 0,
);

Die Tabelle enthält die Datensätze für alle meine Sachen, die mit dem jeweiligen Volumen und Priorität (wie sehr ich es brauche).

Ich habe eine Tasche mit der angegebenen Lautstärke, sagen 1000. Ich möchten wählen Sie aus der Tabelle alle Sachen, die ich kann in eine Tüte, packen die wichtigsten Sachen zuerst.

Dies scheint der Fall für die Verwendung von Fenster-Funktionen, so ist hier die Abfrage, die ich kam mit:

select s.*, sum(volume) OVER previous_rows as total
 from stuff s
 where total < 1000
 WINDOW previous_rows as
  (ORDER BY priority desc ROWS between UNBOUNDED PRECEDING and CURRENT ROW)
 order by priority desc

Das problem dabei ist jedoch, dass Postgres meckert:

ERROR:  column "total" does not exist
LINE 3:  where total < 1000

Wenn ich entfernen Sie diese filter, Spalte "total" wird richtig berechnet, die Ergebnisse richtig sortiert, aber alle Zeug wird ausgewählt, was nicht, was ich will.

So, wie mache ich das? Wie kann ich wählen Sie nur die Elemente, die passen in die Tasche?

InformationsquelleAutor der Frage Maxim Sloyko | 2011-02-18

Schreibe einen Kommentar