Tidak bekerja seperti yang Anda miliki. Fungsi jendela
tidak bisa disebut seperti itu. Variabel catatan Anda r
seperti kursor bawaan dalam FOR
lingkaran. Hanya baris hasil saat ini yang terlihat di dalam loop. Anda harus mengintegrasikan fungsi jendela lag()
ke dalam SELECT
initial awal .
Namun karena Anda tetap mengulang baris dalam urutan yang cocok, Anda dapat melakukannya dengan cara lain.
Pertimbangkan contoh yang sebagian besar ditulis ulang ini. Mengembalikan pada baris pertama yang melanggar:
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;
Petunjuk lainnya
- Mengapa alias untuk
$1
? Anda menamakannya_day
dalam deklarasi sudah. Tetap berpegang pada itu. - Pastikan untuk mengetahui bagaimana PostgreSQL menangani kasus dalam pengidentifikasi . (Saya hanya menggunakan huruf kecil.)
- Anda cukup menambah / mengurangi bilangan bulat (untuk hari) dari tanggal.