【问题标题】:SQL query - possibly requires analytic functionsSQL 查询 - 可能需要分析函数
【发布时间】:2012-06-17 23:53:26
【问题描述】:

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

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

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

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

谢谢 塔姆斯

【问题讨论】:

  • 认为它如何工作?如果您能够证明您拥有tried something for yourself,您可能会发现您得到了更好的答案质量并且人们更愿意帮助您。
  • @Ben - 直到昨天我才听说过分析函数。我建议它需要某种形式的排名和自我加入。我完全错了。我经常发现最好不要让程序员走上一条特定的路线,因为这可能会导致他们走上一条错误的道路,如果我什么都没说,他们就不会走上这条路。我已经能够针对各种其他查询调整昨天的解决方案,但由于它的编写方式,按照要求,我很难看到我如何为此目的调整它。
  • 是的,每个人都在帮助您,但没有任何金钱奖励。如果有人要求这样做;单击<flag> 链接并解释版主发生了什么。如果您有时间,如果您阅读我发布的链接,我将不胜感激。
  • 不是每个人,本。有些人在帮不上忙时更喜欢在一旁发问。

标签: sql oracle


【解决方案1】:

基本上,您需要能够在主/客队计算中引入某种“或”,但您不能(据我所知)在分析函数中这样做。看起来您需要创建一个中间表(它只在查询期间存在,所以我猜是一个视图),其中包含一个带有任一团队名称的附加计算列。您可以为此使用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,并对分析子句进行一些调整,并删除重复项。

【讨论】:

  • 我想你又做了一次,亚历克斯。我只需要一个视图,用 TEAM 而不是主队或客队列出每行两次。然后我可以使用你昨天的解决方案。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多