2012-10-15 45 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,抱歉没有在原始问题中指出这一点。 –