PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL überprüft das Element eines vorherigen Datensatzes


Funktioniert nicht so wie du es hast. Eine Fensterfunktion kann man so nicht nennen. Ihre Datensatzvariable r ist wie ein eingebauter Cursor in einem FOR Schleife. Innerhalb der Schleife ist nur die aktuelle Zeile des Ergebnisses sichtbar. Sie müssten die Fensterfunktion lag() es in das anfängliche SELECT .

Aber da Sie die Zeilen sowieso in einer passenden Reihenfolge durchlaufen, können Sie es auch anders machen.

Betrachten Sie dieses weitgehend umgeschriebene Beispiel. Gibt bei der ersten verletzenden Zeile zurück:

CREATE OR REPLACE FUNCTION q8(_day date)
  RETURNS text AS
$BODY$
DECLARE
    r            record;
    last_enddate date;

BEGIN
FOR r IN
    SELECT *
       -- ,lag(r.endDate) OVER (ORDER BY startDate) AS last_enddate
       -- commented, because I supply an alternative solution
    FROM   periods
    ORDER  BY startDate
LOOP
    IF _day BETWEEN r.startDate AND r.endDate THEN
        RETURN 'Violates condition 1';  -- I return differing results
    ELSIF _day BETWEEN (r.startDate - 7) AND r.startDate THEN
        RETURN 'Violates condition 2';
    ELSIF _day BETWEEN last_enddate AND (r.startDate) THEN 
                                      -- removed "- 7 ", that is covered above
        RETURN 'Violates condition 3';
    END IF;

    last_enddate := r.enddate; -- remember for next iteration
END LOOP;

RETURN NULL;

END;
$BODY$ LANGUAGE plpgsql;

Weitere Hinweise

  • Warum der Alias ​​für $1 ? Sie haben es _day genannt schon in der Deklaration. Bleiben Sie dran.
  • Stellen Sie sicher, dass Sie wissen, wie PostgreSQL mit Groß- und Kleinschreibung für Bezeichner . (Ich verwende nur Kleinbuchstaben.)
  • Sie können einfach ganze Zahlen (für Tage) von einem Datum addieren/subtrahieren.