Корр функция в Oracle - PullRequest
       7

Корр функция в Oracle

0 голосов
/ 04 декабря 2018

возможно ли создать корреляцию в Oracle между строками в двух таблицах?У меня есть две таблицы - одна с температурой, другая с влажностью в разных городах во времени.Я хотел бы создать корреляцию (функция CORR) между температурой и влажностью в данном городе между некоторыми датами, но я не уверен, как это сделать.

Спасибо за вашу помощь!

desc TEMP;

CITY   VALUE       DATE
C1      19.6       2017-10-02 19:01
C3      10.6       2017-10-02 19:01
C3      12         2017-10-02 19:01
C2      10.1        2017-10-02 19:01
C2      18         2017-10-02 19:01
C2      10         2017-10-02 19:01
C1      21.6       2017-10-02 20:01
C1      10.6       2017-10-02 20:01

desc HUMIDITY;

CITY   VALUE       DATE
C1      60         2017-10-02 19:01
C3      70         2017-10-02 19:01
C3      62         2017-10-02 19:01
C2      67         2017-10-02 19:01
C2      68         2017-10-02 19:01
C2      70         2017-10-02 19:01
C1      71.6       2017-10-02 20:01
C1      70.6       2017-10-02 20:01

Я хотел бы выбрать диапазон CITY и DATE(между некоторыми датами), чтобы вычислить корреляцию между VALUE в TEMP и HUMIDTY.

1 Ответ

0 голосов
/ 05 декабря 2018

CTE (с) ниже используется для имитации ваших двух таблиц:

With Temp (City, value, Mdate) as (SELECT 'C1', 19.6, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL 
SELECT 'C3', 10.6, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C3', 12, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 10.1, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 18, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 10, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C1', 21.6, to_date('2017-10-02 20:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C1', 10.6, to_date('2017-10-02 20:01','YYYY-MM-DD HH24:MI') FROM DUAL),

Humidity (City, value, mDate) as (SELECT 'C1', 60, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C3', 70, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C3', 62, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 67, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 68, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C2', 70, to_date('2017-10-02 19:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C1', 71.6, to_date('2017-10-02 20:01','YYYY-MM-DD HH24:MI') FROM DUAL UNION ALL
SELECT 'C1', 70.6, to_date('2017-10-02 20:01','YYYY-MM-DD HH24:MI') FROM DUAL)


--Now this is the query to coorlate the two values between two dates using the two CTE's above. 

SELECT T.City, Corr(T.Value, H.Value)  corr
FROM TEMP T 
INNER JOIN HUMIDITY H 
  on T.City = H.City 
 and T.mDate = H.mDate 
 WHERE T.mDate between to_date('2017-10-01','YYYY-MM-DD') and to_date('2017-11-02','YYYY-MM-DD') 
GROUP BY T.City

Дает нам:

+------+--------------------------------------------+
| City |                    Corr                    |
+------+--------------------------------------------+
| C2   |                                          0 |
| C1   | -0.272343645393387267052058460609147833569 |
| C3   |                                          0 |
+------+--------------------------------------------+
...