Fungerar inte som du har det. En fönsterfunktion
kan inte kallas så. Din postvariabel r
är som en inbyggd markör i en FOR
slinga. Endast den aktuella raden av resultatet är synlig inuti slingan. Du skulle behöva integrera fönsterfunktionen lag()
det till den initiala SELECT
.
Men eftersom du går igenom raderna i en matchande ordning ändå, kan du göra det på ett annat sätt.
Betrakta detta till stor del omskrivna exempel. Returnerar vid den första raden som bryter mot:
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;
Fler tips
- Varför aliaset för
$1
? Du döpte den till_day
redan i deklarationen. Håll dig till det. - Se till att veta hur PostgreSQL hanterar case i identifierare . (Jag använder bara små bokstäver.)
- Du kan bara lägga till/subtrahera heltal (för dagar) från ett datum.