2013-08-20 2 views
1

У меня есть следующая часть запроса, над которым я работаю в MYSQL.MAX с дополнительными критериями

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'.

+1

Существует веский аргумент, что такое форматирование должно выполняться в клиентском коде, а не в инструкции SQL. –

+0

Это нормально, если это так, но как я могу вернуть BatHowOut для каждого отдельного результата, т. Е. Если я группирую игрок, ему нужно вернуть самый высокий показатель для большого набора результатов. – Philip

+0

Я не понимаю логики. Не могли бы вы пояснить, когда должен появиться символ *? Пример слишком смутный для меня. –

ответ

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.

+0

Большое спасибо за это, отлично работает :) – Philip

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 
+0

Что это дает на первых образцах данных? Это две строки, одна с «*» и одна без? –

+0

@JonathanLeffler - Первый из них самый высокий с «Not Out», а второй пример - с «Out». – hims056

+1

+1: Очень близко. Теперь, чтобы получить только «156 *», а не «156». Извините, что я ничья ... ты определенно на правильном пути. –