2017-01-23 5 views
1

У меня есть два совершенно (или полностью несовершенно?) Коррелированные числа, и я хочу найти корреляцию между ними. Первоначальный сценарий отличается и более сложный, но проблема находится где-то в рамках метода корреляции pg. Пожалуйста, рассмотрим следующий запрос:postgresql corr aggregate function return null

WITH all_series AS (
     select t as id, 'One' as name, 1 as num from generate_series(1, 10) t 
     UNION 
     select t as id, 'Two' as name, 2 as num from generate_series(1, 10) t 
     ORDER BY name, id 
    ) 

    SELECT (t1.name || '|' || t2.name) as names, corr(t2.num, t1.num) c 
    FROM all_series t1 
    INNER JOIN all_series t2 ON t1.id = t2.id 
    WHERE t1.name > t2.name 
    GROUP BY (t1.name || '|' || t2.name) 
    ORDER BY (t1.name || '|' || t2.name) 

Если удалить группу и открыть выбирает, номера идеально выровнены, которые должны дать что-то, как корреляции .. но это дает пустой (даже не ноль).

С уважением,

ответ

1

Я предполагаю, что вы хотите корреляции на ряд генерироваться, а не на постоянной 1:

WITH all_series AS (
    select t as id, 'One' as name, 1 as num, t.val from generate_series(1, 10) t(val) 
    UNION ALL 
    select t as id, 'Two' as name, 2 as num, t.val from generate_series(1, 10) t(val) 
    ORDER BY name, id 
) 
SELECT (t1.name || '|' || t2.name) as names, corr(t2.val, t1.val) c 
FROM all_series t1 
INNER JOIN all_series t2 ON t1.id = t2.id 
WHERE t1.name > t2.name 
GROUP BY (t1.name || '|' || t2.name); 

Ваша версия делает корреляцию на num которая постоянна ("1 "или" 2 "). Я думаю, что NULL является результатом деления на нуль в расчете. Корреляция двух постоянных столбцов должна быть 1, но это также вырожденный случай.

+0

Да, проблема была в том, что все значения были точно такими же (не друг против друга, а целая серия с одинаковым значением) ... знаменатель равен 0, pg дает значение null, а не 1 – saGii

+0

@saGii. , , Я должен упомянуть две вещи. (1) Я считаю это ошибкой. (2) Он намекает, что Postgres реализует не численно устойчивый алгоритм корреляции. –