Nie działa tak, jak masz. funkcja okna
nie można tak nazwać. Twoja zmienna rekordu r
jest jak wbudowany kursor w FOR
pętla. Wewnątrz pętli widoczny jest tylko bieżący wiersz wyniku. Trzeba by zintegrować funkcję okna lag()
go do początkowego SELECT
.
Ale ponieważ i tak przeglądasz wiersze w pasującej kolejności, możesz to zrobić w inny sposób.
Rozważmy ten w dużej mierze przepisany przykład. Zwraca w pierwszym naruszającym wierszu:
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;
Więcej wskazówek
- Dlaczego alias dla
$1
? Nazwałeś go_day
już w deklaracji. Trzymaj się tego. - Pamiętaj, aby wiedzieć, jak PostgreSQL obsługuje wielkość liter w identyfikatorach . (Używam tylko małych liter.)
- Możesz po prostu dodać/odjąć liczby całkowite (dla dni) od daty.