2016-10-31 7 views
0

몇 가지 테이블이 있으며 나머지 열과 테이블의 상관 관계를 테이블의 열로 표시하는 방법을 알고 싶습니다.postgresql은 열의 상관 관계를 표시합니다.

  • 타자 (키 : 팀, battingAverage 등, 장타율)
  • 레코드 (키 : 팀이 승리 손실)

예를 들어

,의 내가 2 개 테이블이 있다고 가정 해 보자

I 출력 내가 이것을 달성에 대해 어떻게 갈 것이라고

attribute  | correlation 
battingAverage | .025 
slugging  | .005 
... 

있는 테이블을 원한다면? CORR 함수를 사용하여 두 열 사이의 상관 관계를 찾을 수 있지만 전체 열에 어떻게 적용하는지 혼란스럽고 열과 해당 상관 관계를 한 행에 표시하는 방법을 혼동합니다.

지금은 (values ​​(),(), ...)을 사용하여 하드 코딩하려고 시도하고 있지만 표현식으로 사용될 때 하위 쿼리가 여러 행을 반환한다는 오류가 발생합니다. "SELECT"는 쿼리에서 한 번만 나타나며 어떤 식도 볼 수 없습니다. 당신이 열 당 행을 원하는 경우

여기 (내 프로젝트가 야구와는 아무 상관이없는,하지만 난 예 술이를 만든) 지금 내 모의 최대 쿼리의

SELECT attributes.attribute, (values 
    (CORR(Record.wins,Batting.BattingAverage)), 
    (CORR(Record.wins,Batting.slugging)), 
    (CORR(Record.wins,batting.OBP)), 
    (CORR(Record.wins,batting.HomeRuns))) 
AS correlation 
FROM Batting LEFT JOIN Record ON Batting.Team = Record.Team,(values 
    ('Batting Average'), 
    ('Slugging'), 
    ('OBP'), 
    ('Home Runs')) attributes(attribute) 
GROUP BY attributes.attribute; 

답변

0

, 당신은해야합니다 어떻게 든 이들을 생성하십시오. 십자가 조인 (, 대신 CROSS JOIN이라고 부른 경우 약간 더 읽기 쉬웠을 것입니다)을 사용하여이 작업을 수행하려고합니다. 그러나 select 절을 원하는 특성과 관련시키지 않습니다.

SELECT 
    attributes.attribute, 
    CORR(Record.wins, 
     case attributes.attribute 
     when 'Batting Average' then Batting.BattingAverage 
     when 'Slugging' then Batting.slugging 
     when 'OBP' then Batting.OBP 
     when 'Home Runs' then Batting.HomeRuns 
     end 
    ) AS correlation 
FROM Batting 
JOIN Record ON Batting.Team = Record.Team 
CROSS JOIN (values 
    ('Batting Average'), 
    ('Slugging'), 
    ('OBP'), 
    ('Home Runs')) attributes(attribute) 
GROUP BY attributes.attribute; 

그러나 데카르트 제품을 만들면 해당 값이 적용되는지 여부는 확실하지 않습니다. 나는 모든 행이 같은 요인으로 다중화되기 때문에 그것이 아니라고 생각하지만, 나는 통계와 핵심 계산에 익숙하지 않다.

SELECT 'Batting Average' AS attribute, CORR(r.wins, b.BattingAverage) AS correlation 
    FROM Batting b JOIN Record r ON b.Team = r.Team 
UNION ALL 
SELECT 'Slugging' AS attribute, CORR(r.wins, b.slugging) AS correlation 
    FROM Batting b JOIN Record r ON b.Team = r.Team 
UNION ALL 
SELECT 'OBP' AS attribute, CORR(r.wins, b.OBP) AS correlation 
    FROM Batting b JOIN Record r ON b.Team = r.Team 
UNION ALL 
SELECT 'Home Runs' AS attribute, CORR(r.wins, b.HomeRuns) AS correlation 
    FROM Batting b JOIN Record r ON b.Team = r.Team 

간단한 대안은 UNPIVOT을해야한다 :

차라리 쉽고 안전하게 보호합니다. 그러나 나는 그것을 사용하지는 않았지만 구문을 찾는 것은 쉽습니다. 나는 UNPIVOT이 실제로 가장 적절한 해결책이라고 생각합니다.

+0

두 번째 코드 블록은 매우 직설적인데, 많은 특성이 없기 때문에 한 번에 각 행을 생성하는 것을 고려하지 않았습니다. 고맙습니다! – user3311613