SQL查询 - 可能需要分析函数

时间:2012-06-17 08:15:12

标签: sql oracle

昨天我问了一个类似的问题,答案是正确的。 SQL requiring self join and ranking 虽然这个问题很相似,但我无法让答案适应。

我有一张足球比赛表:

    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场比赛中得分的目标总数(homeGoals + awayGoals)加上当前客场球队在当前比赛之前最近5场比赛中得分的进球数。它不得包含当前比赛的目标。

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

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

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

由于 噬细胞

1 个答案:

答案 0 :(得分:3)

基本上你需要能够在主场/客队计算中引入某种'或',但你不能在分析函数中做到这一点(据我所知)。看起来您需要创建一个中间表(仅在查询期间存在,因此我认为更多的视图)具有带有团队名称的额外计算列。您可以使用unpivot,但丢失了原始列,您可能仍需要它们。所以你可以回到11g之前的假装,如:

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,并对分析条款进行一些调整,并删除重复项。

相关问题