Как выбрать МАКС 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 на ваш запрос, и вы должны получить лучший результат.

Редактировать: кажется, Дерби не поддерживает ограничение количества возвращаемых строк. Тогда лучший способ, вероятно, состоит в том, чтобы создать подвыбор с максимальным результатом пробивания и присоединиться к нему, чтобы получить playerId для печати.

Я начинаю задаваться вопросом, помогаю ли я вам написать что-то для 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

ИЛИ ЖЕ

* Не уверен, что это поддерживается

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

ИЛИ ЖЕ

* Я думаю, что этот будет работать

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
Другие вопросы по тегам