2012-09-19 43 views
0

得到的头,我有以下架构板球数据库:SQL不能围绕逻辑

Bowl(BowlID, MatchID, Striker, Non-Striker, Bowler, Runs, OverNum) 
- Stores info for every ball 
Match(MatchID, Team1, Team2, Date) 
- Stores all the matches 

我试图找出什么是比赛的倒数第二球的百分比得分一定数量的运行。

所以首先我需要得到每场比赛的倒数第二球。我真的不知道该怎么做。 OverNum列存储球号码,所以对于二十二场比赛,这将从'0.1'开始并且上升到'19.6'(假设他们持续出局)。

难道是这样的:

SELECT MatchID, MAX(OverNum) 
FROM Bowl 
WHERE OverNum 
NOT IN (SELECT Max(OverNum) FROM Bowl) 
GROUP BY MatchID 

我不能让我的头围绕确保它从每场比赛的倒数第二,而不是从整碗表中的第二高OverNum ...

+0

你怎么知道一场比赛是20场还是50场? – Vikdor

+0

您的内部select语句应该是:'(SELECT Max(OverNum)FROM Bowl b2 WHERE b2.MatchID = MatchID)' –

回答

0

我想弄清楚比赛倒数第二个球的比例分数是多少分数。

东西在这几行:

SELECT 
    -- Consider each case where the runs scored on the 
    -- penultimate ball is what you wanted as a '1' and rest as '0' 
    (SUM(CASE Runs 
     WHEN @needed THEN 1 
     ELSE 0 
    END) * 100)/SUM(1), 
FROM 
    Bowl b1 
    JOIN 
    (
     // Penultimate ball in a given match. 
     SELECT bNextMax.MatchId, Max(CONVERT(REAL, bNextMax.OverNum)) 
     FROM 
      Bowl bNextMax 
      JOIN (
       SELECT MatchId, MAX(CONVERT(REAL, OverNum)) OverNum 
       FROM Bowl 
       GROUP BY MatchID 
      ) as bMax 
      ON bNextMax.MatchID = bMax.MatchID AND bNextMax.OverNum != bMax.OverNum 
    ) b2 
    ON b1.MatchID = b2.MatchID AND b1.OverNum = b2.OverNum 
+0

谢谢,这给了我一个百分比的良好基础!不过我想我会用下面的评论来得到倒数第二球,因为这是考虑到倒数第二球是球10.4的情况。 (也许他们只在20个队伍中打了11个) –

+0

对,这是有道理的,我在推断最后一个球的时候没有考虑到这一点。 – Vikdor

+0

@DuaneAllman,更新我的查询以获得给定匹配中的倒数第二个球,然后在百分比计算中进行相应的运行。 – Vikdor

0

要获得倒数第二球使用这样的:

select * 
from (
    select matchid, overnum, 
      row_number() over (partition by matchid order by overnum desc) as rn 
    from bowl 
) t 
where rn = 2; 

你没有提到你正在使用的DBMS。以上是ANSI标准的SQL,几乎所有的现代DBMS都支持它。

+0

我通过Java使用HSQL(openoffice基础驱动程序),是否支持? –

+0

@DuaneAllman:不,HSQLDB不支持窗口功能。 –

0

你需要使用一个稍微复杂的内部查询。我假设你正在使用SQL Server,当然,尽管Oracle实际上可能会使这一点更容易一些。

select * from Bowl b 
where OverNum = 
(
    select top 1 OverNum from 
    (
     select top 2 OverNum 
     from Bowl 
     where Bowl.MatchID = b.MatchID 
     order by OverNum desc 
    ) top2 
    order by OverNum asc 
)