2012-03-13 70 views
1

我已经形成了德比以下查询来计算所有棒球运动员的安打率...如何选择MAX SQL

SELECT p1.nameFirst as "First", 
p1.nameLast as "Last", 
(b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) as "SLUGGING" 
FROM Batting b1 join Players p1 on b1.playerID = p1.playerID 
WHERE AB >= 400; 

它生产的所有打者谁在蝙蝠有400以上,并计算它们的猛击的百分比。我的问题是,我只需要选择一个最大塞流率的球员。我尝试用SELECT MAX围绕数学模块,但无济于事。我期望的输出...

何塞·包蒂斯塔0.7426900584795321637426900

此外,有没有什么办法来格式化小数到数字的设定金额是多少?任何建议表示赞赏。

回答

2

ORDER BY SLUGGING DESC LIMIT 1添加到您的查询,你应该得到最好的结果。

编辑: 看来Derby不支持限制返回的行数。那么最好的方法是创建一个带有最大压制效果的子查询,并加入到获得playerId来打印。

+1

谢谢你的建议。我最终找到了限制的解决方法。通过削减DESC FETCH FIRST 1ROWS ONLY; – MCR 2012-03-14 00:21:00

0

我开始怀疑我是否帮助你为MBA写作或做计算机科学作业。 :-)

SELECT 
    p1.nameFirst as "First", 
    p1.nameLast as "Last", 
    b.s AS "SLUGGING" 
FROM 
(
    SELECT 
     MAX(
      (b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) 
     ) AS s 
    FROM 
     Batting b1 
    WHERE 
     b1.AB >= 400 
) m1 
JOIN 
    Batting b 
     ON 
       m1.s = (b.H + (2 * b.doubles) + (3 * b.triples) + (4 * b.HR))/(b.AB * 1.0) 
JOIN 
    Players p1 
     ON 
      b1.playerID = p1.playerID 
WHERE 
    b1.AB >= 400 

OR

*不知道这是支持

SELECT 
    TOP 1 
    p1.nameFirst as "First" 
    , p1.nameLast as "Last" 
    , (b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) AS "SLUGGING" 
FROM 
    Batting b1 
JOIN 
    Players p1 on b1.playerID = p1.playerID 
WHERE 
    b1.AB >= 400 
ORDER BY 
    (b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) DESC 

OR

*我认为,这将工作

SELECT * FROM (
SELECT 
    ROW_NUMBER() OVER(
     ORDER BY 
      (b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) DESC 
    ) as rownum 
    , p1.nameFirst as "First" 
    , p1.nameLast as "Last" 
    , (b1.H + (2 * b1.doubles) + (3 * b1.triples) + (4 * b1.HR))/(b1.AB * 1.0) AS "SLUGGING" 
FROM 
    Batting b1 
JOIN 
    Players p1 on b1.playerID = p1.playerID 
WHERE 
    b1.AB >= 400 
) AS r 
WHERE r.rownum = 1 
+0

SELECT p1.nameFirst如 “第一”, p1.nameLast为 “最后”, m1.s AS “段塞” FROM ( SELECT MAX( (b1.H +(2个* b1.doubles) +(3 * b1.triples)+(4 * b1.HR))/(b1.AB * 1.0) )为S FROM 击球B1 )M1 加入 击球b ON m1.s =( bH +(2 * b.doubles)+(3 * b.triples)+(4 * b.HR))/(b.AB * 1.0) 加入 玩家p1 ON b.playerID = p1.playerID WHERE b.AB> = 400; – MCR 2012-03-13 23:45:30

+0

我不得不修改你的第一个查询(见上面),但现在它给了我“错误:试图除以零”。原来这条语句SELECT MAX( (b1.H +(2 * b1.doubles)+(3 * b1.triples)+(4 * b1.HR))/(b1.AB * 1.0) )AS s正在返回空。任何想法为什么? – MCR 2012-03-13 23:49:15

+0

我最终找到了基于其他帖子的解决方法,但我很好奇看到这种方法。任何想法为什么它除以0?谢谢 – MCR 2012-03-14 00:23:29