Показать наибольшую разницу между 1 и 2 в группе

0
Name   Day   Points
Brian     1        6
Tom       1       11
Freddy    1        7
Kim       2       10
Sandra    2        1
Brian     2        3

Мне нужно знать, кто выиграл с самым большим пределом на второй, но только между людьми в тот же день.

Таким образом, если все сделано правильно, это скажет мне, что Ким выиграл с наибольшей разницей.

Я не совсем понимаю, как обращаться с этим.

  • 0
    Что ты имеешь в виду под «наибольшим отрывом от второго» Я не понимаю вопрос.
  • 0
    Наибольшая разница в числе 2. В первый день лучший человек - Том, второй лучший - Фредди. Маржа = 4. На второй день разница между лучшим (Ким) и номером два (Брайан) = 7.
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ
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 ;
  • 0
    +1 Обыграй меня!
  • 0
    Это будет работать? name является ни агрегированным, ни сгруппированным.
Показать ещё 2 комментария
0

Это нужно сделать с помощью двух подзапросов... Внутреннее большинство, чтобы получить наивысший балл за один день, затем найдите следующий самый высокий уровень в позиции первого места, затем найдите запас... Однако, из-за ваших выборочных данных только с именами, без учета уникальных имен, которые в противном случае были бы с помощью некоторого внутреннего идентификатора... Скажите "Брайан" в ваших данных образца... это тот же Брайан в оба дня, или это другое человек. Кроме того, что, если два человека привязаны к первому месту с 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню