MAX有额外的标准

时间:2013-08-20 04:42:16

标签: mysql

我在MYSQL中处理了以下部分查询。

SELECT
  MAX(CAST(MatchPlayerBatting.BatRuns AS SIGNED)) AS HighestScore
FROM
  MatchPlayerBatting

返回正确的结果。然而,我还需要另一个专栏来解决这个问题。

即如果它找到的最大值也具有"而不是"在" BatHowOut"中,它应该显示结果,例如96 *而不是96.

怎么可以这样做?

为了使数据具体化,请考虑两种情况:

BatRuns   BatHowOut
    96    not out
    96    lbw

BatRuns   BatHowOut
    96    not out
   102    lbw

对于第一个数据,答案应为'96*';对于第二个,'102'

2 个答案:

答案 0 :(得分:1)

你可以使用像这样的自联接来实现这个目的:

SELECT t1.ID
, CONCAT(t1.BatRuns, 
         CASE WHEN t1.BatHowOut = 'Not Out' THEN '*' ELSE '' END
        ) AS HighScore
  FROM MatchPlayerBatting t1
  JOIN
  (
      SELECT MAX(BatRuns) AS HighestScore
      FROM MatchPlayerBatting
  ) t2
  ON t1.BatRuns = t2.HighestScore

答案 1 :(得分:0)

如何按降序排列乐谱并仅选择第一张唱片?

select concat(BatRuns , case when BatHowOut = 'not out' then '*' else '' end)
  from mytable
order by cast(BatRuns as signed) desc,
        (case when BatHowOut = 'not out' then 1 else 2 end)
limit 1;

示例here

如果你想找到每个玩家的最高分数,这里的解决方案可能并不优雅,但效果很好。

select PlayerID,
       case when runs != round(runs)
                 then concat(round(runs),'*')
            else
                 round(runs)
       end highest_score
  from (select PlayerID,
               max(cast(BatRuns as decimal) + 
                   case when BatHowOut = 'not out' then 0.1 else 0 end
                  ) runs
          from MatchPlayerBatting
         group by PlayerID) max_runs;

这利用了以下事实:运行永远不会是分数,只能是整数。如果得分最高并且其中一个是不败的, 在不败分数中加0.1会使其成为最高分。这可以在以后删除并与*连接。

示例here