2012-10-15 83 views
4

這是使用MYSQL 我的問題是以下內容。我有一個棒球數據庫,在那個棒球數據庫中有一個主表,列出了所有曾經玩過的球員。還有一個擊球桌,可以跟蹤每個球員的擊球統計數據。我創造了一個將這兩者結合在一起的觀點;因此masterplusbatting表。 我現在想從棒球開始的每個十年中找到最高的人力資源擊球手。這是我試過的。SQL Query返回最大值數十年

select f.yearID, truncate(f.yearid/10,0) as decade,f.nameFirst, f.nameLast, f.HR 
    from (
    select yearID, max(HR) as HOMERS 
    from masterplusbatting group by yearID 
    )as x inner join masterplusbatting as f on f.yearID = x.yearId and f.HR = x.HOMERS 
    group by decade 

你可以看到,我截斷,以便在yearID得到187, 188, 189等,而不是1897, 1885,。然後,我將這十年分組,認爲這會使我每十年中達到最高水平,但它並沒有返回正確的值。例如,它在2004年給了我48位HR的Adrian Beltre,但是大家都知道Barry Bonds在2001年達到了73人。任何人都可以給我一些建議嗎?

+0

您將需要按'十年'分組而不是幾年。這可能是一個數據問題 - 或者你需要在第一個日期做更多的數學計算 – Randy

+0

這是什麼類型的SQL?對於不同的供應商和實施,可用的功能是不同的...... – RBarryYoung

+1

題外話,但'每個人都知道Barry Bonds在2001年達到73人力資源'對我來說似乎相當樂觀(特別是考慮到這裏的觀衆) – MiMo

回答

2
SELECT 
    Lookup.DecadeID, 
    Data.* 
FROM 
(
    SELECT 
    truncate(yearid/10,0) as decadeID, 
    MAX(HR) as Homers 
    FROM 
    masterplusbatting 
    GROUP BY 
    truncate(yearid/10,0) 
) 
    AS lookup 
INNER JOIN 
    masterplusbatting AS data 
    ON data.yearid >= lookup.decadeID * 10 
    AND data.yearid < lookup.decadeID * 10 + 10 
    AND data.HR  = lookup.homers 

Editted爲MySQL

+0

對不起,我想這不會幫助我,因爲我不認爲在MySQL中工作。不管怎麼說,還是要謝謝你。 –

+0

@abrahamlincoln:編輯爲MySql。 iPhone上的道歉仍然存在,如果有錯別字等 – MatBailie

+0

謝謝,這個工作很完美。 –

0

您的查詢似乎是由錯誤的東西聚合。在某個地方,我希望看到一個以玩家爲基礎的小組。

select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs 
from masterplusbatting mpb 
group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast 

這給出了每個十年的本壘打總數。現在,你想要的人最多。對於這一點,我會用row_number()功能和子查詢:

select decade, nameFirst, nameLast, HRs 
from (select decade, nameFirst, nameLast, HRs, 
      row_number() over (partition by decade order by HRs desc) as seqnum 
     from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs 
      from masterplusbatting mpb 
      group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast 
      ) t 
    ) t 
where seqnum = 1 
order by 1 

在數據庫如MySQL,你需要一個這樣做第二個連接:

select t.* 
from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs 
     from masterplusbatting mpb 
     group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast 
    ) t join 
    (select decade, max(HRs) as maxHRs 
     from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs 
      from masterplusbatting mpb 
      group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast 
      ) t 
     group by decade 
    ) tsum 
    on t.decade = tsum.decade and t.HRs = tsum.maxHRs 
order by decade 
+0

感謝您的回覆。我是mysql新手,對'row_number()over'不知道任何事情,它給我一個語法錯誤。任何想法爲什麼這可能是? –

+0

你使用了哪個數據庫? –

+0

MySQL,抱歉沒有在原始問題中指出這一點。 –