postgresql corr聚合函数返回null

postgresql corr聚合函数返回null,sql,postgresql,aggregate-functions,correlation,Sql,Postgresql,Aggregate Functions,Correlation,我有两个完全(或完全不完全)相关的数字,我想找出它们之间的相关性。最初的情况不同,也更复杂,但问题出在pg使用的相关方法的某个地方。请考虑以下查询: 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_se

我有两个完全(或完全不完全)相关的数字,我想找出它们之间的相关性。最初的情况不同,也更复杂,但问题出在pg使用的相关方法的某个地方。请考虑以下查询:

    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:

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”)。我猜空值是由计算中除以零得到的。两个常量列的相关性应为1,但这也是一种退化情况。

是的,问题在于所有值都完全相同(不是相互对立,而是整个系列具有相同的值)。。。分母为0时,pg给出null和not1@saGii . . . 我应该提到两件事。(1)我认为这是一个错误。(2) 这暗示Postgres正在实现一种非数值稳定的相关算法。