Dada a seguinte estrutura de dados:
X | S |
---|---|
1 | 10 |
1 | 15 |
1 | 12 |
2 | 32 |
2 | 11 |
2 | 45 |
2 | 55 |
3 | 23 |
3 | 34 |
3 | 56 |
3 | 23 |
3 | 45 |
4 | 32 |
4 | 84 |
4 | 24 |
4 | 23 |
Gosto de correlacionar X com Y. Levando em conta todos os dados, isso é trivial, claro:
SELECT CORR(X,Y) FROM some_table;
Mas gosto de correlacionar X com Y de forma contínua. Então o resultado pode ser assim:
X | CORR(X,Y) |
---|---|
1 | 0,40 |
2 | 0,43 |
Para a linha X=1, CORR(X,Y) reflete a correlação de X com Y, mas apenas para X sendo 1,2 ou 3. Da mesma forma, para a linha X=2, a correlação é apenas para X sendo 2,3 ou 4.
Mas, para ser honesto, não tenho ideia de como cobrir isso. Primeiro, pensei em usar uma espécie de combinação de GROUP BY, LAG e PARTITION, mas não tenho ideia de como combiná-los de maneira sensata.
Usando uma função de janela com
order by x range between current row and 2 following
(que encontrará a correlação entre todas as linhas com x = valor atual e valor atual + 2):Configurar:
Saída:
Verificado com:
Para mostrar nulo para linhas onde o intervalo de x não é 3:
Saída: