Не съм сигурен как бихте използвали 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, нямате нужда от функцията:можете просто да извадите датите.