2012-09-19 82 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 
)