मुझे यकीन नहीं है कि आप PERCENTILE_CONT
का उपयोग कैसे करेंगे? आप जो प्रक्षेप चाहते हैं उसे करने के लिए, लेकिन एक अलग विश्लेषणात्मक कार्य की सहायता से आप जो चाहते हैं उसे प्राप्त कर सकते हैं।
सबसे पहले, हम निम्नलिखित फ़ंक्शन बनाएंगे, जो INTERVAL DAY TO SECOND
को कन्वर्ट करता है सेकंड में मान:
CREATE OR REPLACE FUNCTION intvl_to_seconds(
p_interval INTERVAL DAY TO SECOND
) RETURN NUMBER DETERMINISTIC
AS
BEGIN
RETURN EXTRACT(DAY FROM p_interval) * 24*60*60
+ EXTRACT(HOUR FROM p_interval) * 60*60
+ EXTRACT(MINUTE FROM p_interval) * 60
+ EXTRACT(SECOND FROM p_interval);
END;
/
इस फ़ंक्शन के साथ हम निम्न जैसे क्वेरी का उपयोग कर सकते हैं:
SELECT d1.time,
d1.value AS value1,
q2.prev_value + intvl_to_seconds(d1.time - q2.prev_time) * (q2.next_value - q2.prev_value)/intvl_to_seconds(q2.next_time - q2.prev_time) AS value2
FROM devices d1
LEFT OUTER JOIN (SELECT d2.time AS prev_time,
d2.value AS prev_value,
LEAD(d2.time, 1) OVER (ORDER BY d2.time) AS next_time,
LEAD(d2.value, 1) OVER (ORDER BY d2.time) AS next_value
FROM devices d2
WHERE d2.deviceid = 2) q2
ON d1.time BETWEEN q2.prev_time AND q2.next_time
WHERE d1.deviceid = 1;
मैंने आपका डेटा ऊपर लिया, टाइमस्टैम्प के दिनांक घटक को आज के लिए सेट किया, और जब मैंने उपरोक्त क्वेरी चलाई तो मुझे निम्नलिखित परिणाम मिले:
TO_CHAR(D1.TIME) VALUE1 VALUE2 ------------------------------------- ---------- ---------- 09-SEP-11 01.00.00.000000 1 09-SEP-11 01.00.01.000000 1.03 552.517625 09-SEP-11 01.00.02.000000 1.063 552.404813
(मैंने एक TO_CHAR
जोड़ा है लगभग d1.time
SQL*Plus में अत्यधिक रिक्ति को कम करने के लिए।)
अगर आप DATE
का उपयोग कर रहे हैं s के बजाय TIMESTAMP
s, आपको फ़ंक्शन की आवश्यकता नहीं है:आप केवल तिथियों को घटा सकते हैं।