2015-02-27 3 views
0

У меня есть таблица выглядитКорреляционная функция над аналитической функции

TDate   Name  Value  
20110101  xxx  1.2 
20110102  xxx  1.3 
... 
20110101  yyy  3.4 
20110101  yyy  32.1 

Я хочу, чтобы вычислить корреляцию между значением каждого имени (скажем, между ххх и ууу). Вот мой код:

Create table corrDEC as 
Select distinct a.name ASymbol,b.name BSymbol, 
corr(a.value,b.value) over (partition by a.name,b.name) Correlation 
From logprofitDEC a, logprofitDEC b 
where a.name<>b.name 
Order by 1,2,3 desc; 

ли я добавить

where To_date(a.Tdate,'YYYYMMDD')=To_date(b.Tdate,'YYYYMMDD') 

в ИНЕКЕ, пожалуйста?

Как улучшить мою эффективность, исправив там предложение?

+0

Ну, 'corr' является симметричным, поэтому вам нужно только' where a.name

+0

Спасибо, Джек, я это исправим. – user4441082

+1

Я не вижу огромной разницы в пять раз, о которых вы просили об этом. –

ответ

0

Если вы хотите корреляцию между х-х и у-х, и каждый из них имеет дату, связанную с ними, то вы хотите что-то вроде:

select corr(x, y) 
from (select tdate, max(case when name = 'xxx' then value end) as x 
      max(case when name = 'yyy' then value end) as y 
     from logprofitDEC 
     group by tdate 
    ) t; 

Хотя вы можете выразить это в виде аналитической функции, я не см. преимущество при этом.

+0

Спасибо, Гордон за ваш любезный ответ. Есть еще одна проблема. Если мой стол огромен с именем ~ 5000, как исправить код, который вы дали для его решения, пожалуйста? – user4441082

+0

@ пользователь4441082. , , Это другой вопрос. Я думаю, вам придется написать цикл PL/SQL для обработки 12,5 миллионов комбинаций пар имен. –

+0

Спасибо за ваше терпение, я застрял на этой проблеме в течение двух дней. Не знаю, как это исправить ... – user4441082

Смежные вопросы