Nefunguje tak, jak to máte. funkce okna
se tak nedá nazvat. Vaše proměnná záznamu r
je jako vestavěný kurzor v FOR
smyčka. Uvnitř smyčky je viditelný pouze aktuální řádek výsledku. Museli byste integrovat funkci okna lag()
do počátečního SELECT
.
Ale protože stejně procházíte řádky ve shodném pořadí, můžete to udělat jiným způsobem.
Zvažte tento z velké části přepsaný příklad. Vrátí se na první řádek porušující pravidla:
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;
Další rady
- Proč alias pro
$1
? Pojmenovali jste to_day
již v prohlášení. Držte se toho. - Ujistěte se, že víte, jak PostgreSQL zpracovává malá písmena v identifikátorech . (Používám pouze malá písmena.)
- Od data můžete pouze sčítat/odečítat celá čísla (pro dny).