sql - postgresql corr 聚合函数返回 null

标签 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_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”)。我猜 NULL 是计算中除以零的结果。两个常量列的相关性应该是1,但也是退化的情况。

关于sql - postgresql corr 聚合函数返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41807540/

相关文章:

sql - 将列值作为属性添加到 xml 字段

PostgreSQL 触发器不工作 - 既不在删除之前也不在删除之后

postgresql - 如何在 pgAdmin 中执行 COPY 语句

sql - 简化 WHERE (NOT) IN (...) 和 WHERE (NOT) IN (...)

sql - 为什么不能在单个SELECT中混合使用Aggregate值和Non-Aggregate值?

sql - SQLite UPDATE语句中的相关子查询(或等效查询)?

mysql - 仅当 `in` 子句中的值存在时才返回值

sql - UPDATE 语句因锁定而挂起

postgresql - 用于时间序列的 Postgres hstore

mysql - 从 SQL 返回 json 对象数组