Skip to main content
Computes the correlation between two numeric expressions. If either one of expressions is NULL - that input row is ignored.

Covariance vs Correlation

Covariance and correlation both describe how two variables change together, but they do so in different ways:
  • Covariance measures the direction of the relationship between two variables:
    • Positive covariance: variables tend to increase together.
    • Negative covariance: one increases as the other decreases.
    • Its value is unbounded and depends on the units of the variables, making it hard to interpret on its own.
  • Correlation, specifically Pearson correlation, standardizes the relationship:
    • It is the normalized version of covariance, giving a unitless measure between -1 and 1.
    • This makes it easier to compare the strength of relationships between different pairs of variables.
For information on covariance see COVAR_POP

Syntax

CORR(<expr1>, <expr2>) [FILTER ([WHERE] <condition>)]

Parameters

ParameterDescriptionSupported input types
<expr1>First numeric expression to use for correlation computation.DOUBLE PRECISION
<expr2>Second numeric expression to use for correlation computation.DOUBLE PRECISION
<condition>An optional boolean expression to filter rows used in aggregationBOOL

Return Type

CORR returns a result of type DOUBLE PRECISION.

Examples

The playstats table contains the following data:
SELECT currentlevel, currentscore, currentspeed FROM playstats ORDER BY currentlevel DESC, currentscore DESC LIMIT 5;
currentlevel int nullcurrentscore long nullcurrentspeed float null
7501667345
750164230
750161862
750158164
7501544171

Rows: 5Execution time: 3.76ms

currentscore and currentlevel in the playstats table are highly correlated — higher-level players tend to have higher scores — so the result is close to 1:
SELECT ROUND(CORR(currentscore::double precision, currentlevel::double precision), 4) AS correlation
FROM playstats;
correlation double null
0.9641

Rows: 1Execution time: 7.72ms

currentlevel and currentspeed are not correlated — a player’s level says nothing about their current speed — so the result is close to 0:
SELECT ROUND(CORR(currentlevel::double precision, currentspeed::double precision), 4) AS correlation
FROM playstats;
correlation double null
-0.0077

Rows: 1Execution time: 7.56ms