3

我昨天问了一个类似的问题,得到了正确的回答。需要自我连接和排名的 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 的值。它是当前主队最近 5 场比赛的总进球数(主场进球+客场进球)加上当前客队在本场比赛之前最近 5 场比赛的进球数。它不能包括当前比赛的进球。

与昨天的问题不同的是,它只计算了之前主队主场比赛和客队客场比赛的比赛。有了这个问题,主队之前是在主场还是客场比赛都没有关系。他们只需要成为上一场比赛的球队之一。

和以前一样,应该只使用当前赛季的比赛,如果任何一支球队在赛季中没有打过 5 场比赛,那么 totalGoals 应该保持为 NULL。

我可以使用 PL/SQL 做到这一点,但我更喜欢 SQL 查询。昨天的解决方案比我的 PL/SQL 快大约一千倍。

谢谢塔姆斯

4

1 回答 1

3

本质上,您需要能够在主队/客队计算中引入某种“或”,但在分析函数中(据我所知)您不能这样做。看起来您需要创建一个中间表(它仅在查询期间存在,所以我猜是更多视图),其中包含一个带有任一团队名称的附加计算列。您可以使用unpivot它,但您会丢失可能仍需要的原始列。因此,您可以回退到 11g 之前的 psuedo-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)

这将为您原始表中的每一行提供两行。您应该能够将其用作(另一个)子查询来代替matches昨天的答案,并对分析子句进行一些调整,并删除重复项。

于 2012-06-17T10:06:20.160 回答