Name Day Points Brian 1 6 Tom 1 11 Freddy 1 7 Kim 2 10 Sandra 2 1 Brian 2 3
Мне нужно знать, кто выиграл с самым большим пределом на второй, но только между людьми в тот же день.
Таким образом, если все сделано правильно, это скажет мне, что Ким выиграл с наибольшей разницей.
Я не совсем понимаю, как обращаться с этим.
select
first_place.name,
max_points-max(points) as max_margin
from the_table
inner join
(select name, day, max(points) as max_points
from the_table group by day) as first_place
on the_table.day=first_place.day
where the_table.points<max_points
group by the_table.day
order by max_margin desc limit 1 ;
name
является ни агрегированным, ни сгруппированным.
Это нужно сделать с помощью двух подзапросов... Внутреннее большинство, чтобы получить наивысший балл за один день, затем найдите следующий самый высокий уровень в позиции первого места, затем найдите запас... Однако, из-за ваших выборочных данных только с именами, без учета уникальных имен, которые в противном случае были бы с помощью некоторого внутреннего идентификатора... Скажите "Брайан" в ваших данных образца... это тот же Брайан в оба дня, или это другое человек. Кроме того, что, если два человека привязаны к первому месту с 11 очками, тогда мой запрос будет показывать ОБОИХ людей на первом месте перед маржой до теперь "третьего" места в качестве обнаруженного поля. Вам, вероятно, придется изменить некоторые, чтобы приспособить описанные условия.
SELECT
FS.Day,
FS.FirstPlace,
FS.SecondPlace,
FS.FirstPlace - FS.SecondPlace as Margin,
G.Name
FROM
( SELECT G2.Day,
FirstPlace.FirstPlacePoints FirstPlace,
MAX( G2.Points ) as SecondPlace
FROM
Games G2,
( SELECT Day,
MAX( Points ) as FirstPlacePoints
FROM
Games
GROUP BY
Day ) FirstPlace
WHERE
G2.Day = FirstPlace.Day
AND G2.Points < FirstPlace.FirstPlacePoints
GROUP BY
1, 2 ) as FS,
Games G
WHERE
FS.Day = G.Day
and FS.FirstPlace = G.Points
ORDER BY
Margin desc
LIMIT 1