Получить максимальное среднее значение для каждой отдельной записи в запросе SQL - PullRequest
6 голосов
/ 16 марта 2012

У меня есть несколько таблиц, которые содержат данные об игроках и играх, которые они играли в этот сезон в боулинг-центре во время своих лиг. Этот конкретный запрос используется для сортировки лучших средних значений Х в этом году для мужчин и женщин. У меня есть все это, но у меня все еще есть проблема в каком-то конкретном случае, когда некоторые игроки играют в нескольких лигах и имеют более одного из своих средних в верхнем X.

Очевидно, я хочу перечислить только лучшее среднее значение для данного игрока, поэтому, если у игрока А есть лучшее среднее значение с 200 в Лиге ABC, а также второе лучшее среднее с 198 в Лиге DEF, я хочу только 200 перечисленных.

Вот упрощенная версия запроса, которую я хотел бы изменить, потому что сейчас я должен удалить дубликаты вручную, или мне придется написать сортировщик на другом языке, но я бы предпочел сделать это на чистом SQL. (Я удалил только нерелевантную информацию из запроса для этого примера):

SELECT playerId, ROUND(AVG(score),2)Average, season, leagueName, COUNT(score)NumGames FROM Scores
WHERE season = '2011-2012' AND score > -1
GROUP BY season, playerID, leagueName
ORDER BY Average DESC LIMIT 0,30

Как правило, таблица Scores содержит каждую отдельную игру, идентификатор игрока, сезон, в который игра была сыграна, и имя лиги (и другие столбцы, которые не требуются в этом примере).

WHERE - убедиться, что игра была сыграна в этом сезоне, и что счет положительный (-1 для тех, кто отсутствует). Я группирую все по сезону, playerID и leagueName, так что я получаю среднее значение PER LEAGUE для каждого игрока вместо среднего значения всех игр, сыгранных в разных лигах.

Я попытался использовать ключевое слово DISTINCT, но это не сработало, потому что я не могу использовать DISTINCT только для одного столбца. Я также пробовал другие вещи, но ни одна из них даже близко не подошла к работе, поэтому мне интересно, можно ли вообще это сделать или мне придется прибегнуть к использованию другого языка для сортировки этого набора результатов и удаления дубликатов?

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Вы можете рассчитать среднее значение для каждого игрока в лиге в подзапросе:

select  playerId
,       max(league_avg.score)
from    (
        select  playerId
        ,       avg(score) as score
        from    Scores
        where   season = '2011-2012' 
                and score > -1
        group by
                playerId
        ,       leagueName
        ) as league_avg
group by
        playerId
1 голос
/ 16 марта 2012

ОК, это немного сложно.Я предполагаю, что вы можете использовать таблицу SELECT xxx INTO для создания временной таблицы?В этом случае эти два выбора дадут вам то, что вы хотите:

Во-первых, я предполагаю, что ваш запрос выше создал таблицу с именем tmpscores.

Затем вам нужно получить для каждого игрока, ЛУЧШИЕ результаты:

select playerID, MAX(average) AS bestscore
INTO bestscores
FROM tmpscores
GROUP BY playerID, season

Наконец, возьмите очки рекордов и снова присоединитесь к временным показателям, чтобы получить правильную лигу и количество игр:

    SELECT bs.playerId, bs.bestscore, ts.season, ts.leaguename, ts.numgames
    FROM bestscores bs
    JOIN tmpscores ts ON bs.playerID = ts.playerId and bs.bestscore = ts.average

Там!Все в SQL.

Надеюсь, это поможет!

...