2016-10-31 3 views
0

Итак, у меня есть несколько таблиц, и я хотел бы посмотреть, как я мог бы представить корреляцию одного из столбцов по сравнению с остальным как столбец в моей таблице.postgresql отображение корреляции в столбцах

Для примера, скажем, у меня есть 2 таблицы:

  • ватин (ключ: команды, battingAverage, пробки и т.д.)
  • Record (ключ: Команда выигрывает, потеря)

Если я нужна таблица, выход которого является

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

Как бы идти о достижении этой цели? Я знаю, что могу использовать функцию CORR, чтобы найти корреляцию между двумя столбцами, но я смущен тем, как я применяю ее ко всему столбцу, и как я могу отобразить этот столбец и его корреляцию в строке.

Прямо сейчас я пытаюсь использовать его в жестком коде (значения(),(), ...), но я получаю сообщение об ошибке, что мой подзапрос возвращает несколько строк при использовании в качестве выражения, но «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

Смежные вопросы