Không hoạt động theo cách bạn có. Một chức năng cửa sổ
không thể được gọi như vậy. Biến bản ghi của bạn r
giống như một con trỏ tích hợp trong FOR
vòng. Chỉ hàng hiện tại của kết quả được hiển thị bên trong vòng lặp. Bạn sẽ phải tích hợp chức năng cửa sổ lag()
nó vào SELECT
ban đầu .
Nhưng vì bạn vẫn đang lặp lại các hàng trong một thứ tự phù hợp, bạn có thể làm theo cách khác.
Hãy xem xét ví dụ được viết lại phần lớn này. Trả về ở hàng vi phạm đầu tiên:
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;
Thêm gợi ý
- Tại sao lại đặt bí danh cho
$1
? Bạn đã đặt tên cho nó là_day
trong phần khai báo đã có. Bám sát vào nó. - Đảm bảo biết cách PostgreSQL xử lý trường hợp trong số nhận dạng . (Tôi chỉ sử dụng chữ thường.)
- Bạn chỉ có thể cộng / trừ các số nguyên (cho ngày) từ một ngày.