Как выбрать МАКС 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