2012-06-17 5 views
3

Вчера я задал аналогичный вопрос, на который был дан ответ правильно. SQL requiring self join and ranking Хотя этот вопрос подобен, я не могу адаптировать ответ в соответствии.SQL-запрос - возможно, требует аналитических функций

У меня есть таблица результатов футбольных:

CREATE TABLE matches(
    season NUMBER(4), 
    matchDate DATE, 
    homeTeam VARCHAR2(25), 
    awayTeam VARCHAR2(25), 
    homeGoals NUMBER(2), 
    awayGoals NUMBER(2), 
    totalGoals NUMBER(3)); 

заявления INSERT можно найти здесь: https://gist.github.com/2941229

Я желаю, чтобы вычислить значение для totalGoals следующим образом. Это общее количество забитых голов (homeGoals + awayGoals) в 5 последних матчах, которые играла нынешняя команда хозяев, добавила к числу голов, забитых в 5 последних матчах, которые сыграла текущая команда гостей перед текущим матчем. Он не должен включать цели из текущего матча.

Разница со вчерашним вопросом заключалась в том, что он учитывал только предыдущие матчи, где хозяева играли дома, а гости играли в гостях. С этим вопросом не имеет значения, родилась ли домашняя команда дома или вне дома. Они просто должны были быть одной из команд в этом предыдущем матче.

Как и прежде, следует использовать только совпадения от текущего сезона, и если какая-либо из команд не сыграла 5 матчей в сезоне, то totalGoals должны оставаться NULL.

Я могу сделать это с помощью PL/SQL, но я бы предпочел SQL-запрос. Вчерашнее решение было примерно в тысячу раз быстрее, чем мой PL/SQL.

Благодаря Tams

+0

Как вы думаете, что это может сработать? Вы можете найти более качественное ответное сообщение и что люди готовы помочь вам, если вы сможете продемонстрировать, что вы [попробовали что-то для себя] (http://mattgemmell.com/2008/12/08/what -ты пробовал/). – Ben

+0

@Ben - До вчерашнего дня я никогда не слышал об аналитических функциях. Я предполагал, что для этого потребуется какая-то форма ранжирования и самостоятельного присоединения. Я был совершенно неправ. Я часто считаю, что лучше не руководить программистом по определенному маршруту, так как это может привести к неверному пути, что они не спустились бы, если бы я ничего не сказал. Я смог адаптировать вчерашнее решение для множества других запросов, но из-за того, как он написан, по просьбе, мне трудно понять, как я могу адаптировать его для этой цели. – Tams

+0

Не все, Бен. – Tams

ответ

3

По сути вы должны быть в состоянии ввести «или» какое-то к дому/выездных расчетам команды, но вы не можете сделать это (насколько я знаю), внутри аналитические функции. Похоже, вам нужно создать промежуточную таблицу (которая существует только во время запроса, поэтому я думаю больше), у которого есть дополнительный вычисленный столбец с именем команды. Вы можете использовать unpivot для этого, но вы потеряете исходные столбцы, которые вам все еще могут понадобиться. Таким образом, вы можете упасть обратно на предварительно 11g псевдо-UNPIVOT, что-то вроде:

select season, matchdate, hometeam, awayteam, homegoals, awaygoals, 
    case when rn = 1 then hometeam else awayteam end as anyteam 
from matches 
cross join (select level as rn from dual connect by level <= 2) 

Это даст вам две строки для каждого в исходной таблице. Вы должны использовать это как подзапрос (nother) вместо matches во вчерашнем ответе, с некоторой настройкой предложений аналитики и что-то, чтобы удалить дубликаты.

+0

Думаю, вы снова это сделали, Алекс.Мне просто нужно представление, которое перечисляет каждую строку дважды с помощью TEAM, а не hometeam или awayteam. Тогда я смогу использовать ваше решение со вчерашнего дня. Еще раз спасибо! – Tams

+0

Я делаю это 28 ... – Tams

+0

Исправление, это 30. У меня есть работа. Спасибо Алекс. – Tams