आपके पास मौजूद तरीके से काम नहीं करता है। एक विंडो फ़ंक्शन
ऐसा नहीं कहा जा सकता। आपका रिकॉर्ड वैरिएबल r
के लिए
. में एक अंतर्निर्मित कर्सर की तरह है फंदा। लूप के अंदर परिणाम की केवल वर्तमान पंक्ति दिखाई देती है। आपको विंडो फ़ंक्शन <को एकीकृत करना होगा। कोड> अंतराल ()
इसे आरंभिक चुनें
. में ।
लेकिन चूंकि आप वैसे भी पंक्तियों को एक मिलान क्रम में लूप कर रहे हैं, आप इसे दूसरे तरीके से भी कर सकते हैं।
इस बड़े पैमाने पर फिर से लिखे गए उदाहरण पर विचार करें। उल्लंघन करने वाली पहली पंक्ति में वापसी:
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;
और संकेत
$1
के लिए उपनाम क्यों ? आपने इसे_day
. नाम दिया है पहले से ही घोषणा में। उससे चिपके रहें।- यह जानना सुनिश्चित करें कि PostgreSQL कैसे संभालता है पहचानकर्ताओं में मामला . (मैं केवल लोअर केस का उपयोग करता हूं।)
- आप किसी तिथि से केवल पूर्णांक (दिनों के लिए) जोड़ / घटा सकते हैं।