Fungerer ikke, som du har det. En vinduefunktion
kan ikke kaldes sådan. Din registreringsvariabel r
er som en indbygget markør i en FOR
sløjfe. Kun den aktuelle række af resultatet er synlig inde i løkken. Du skal integrere vinduefunktionen lag()
det ind i den indledende SELECT
.
Men da du alligevel går gennem rækkerne i en matchende rækkefølge, kan du gøre det på en anden måde.
Overvej dette stort set omskrevne eksempel. Returnerer ved den første overtrædelsesrække:
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;
Flere tip
- Hvorfor alias for
$1
? Du gav den navnet_day
allerede i erklæringen. Hold dig til det. - Sørg for at vide, hvordan PostgreSQL håndterer bogstaver i identifikatorer . (Jeg bruger kun små bogstaver.)
- Du kan bare tilføje / trække heltal (for dage) fra en dato.