AVG с LIMIT и GROUP BY - PullRequest
       45

AVG с LIMIT и GROUP BY

0 голосов
/ 31 августа 2018

Я ищу SQL-запрос, но не могу ... и не могу найти пример, подобный моему.

У меня есть простая таблица Люди с 3 столбцами, 7 записей:

Table People Image

Я хотел бы получить за каждую команду, средние очки 2 лучших человека.

Мой запрос:

SELECT team
     , (SELECT AVG(point) 
          FROM People t2 
         WHERE t1.team = t2.team 
         ORDER 
            BY point DESC 
         LIMIT 2) as avg 
  FROM People t1 
 GROUP 
    BY team

Текущий результат: (в среднем по всем людям в каждой команде)

Current Result Image

По-видимому, невозможно использовать ограничение в подзапросе. «ORDER BY point DESC LIMIT 2» игнорируется.

Ожидаемый результат:

Result Expected Image

Я хочу получить средние баллы по 2 лучших человека (с наивысшими баллами) для каждой команды, а не средние баллы по всем людям в каждой команде.

Как я могу это сделать? Если у кого есть идеи ..

Я в базе данных MySQL

Ссылка скрипки: http://sqlfiddle.com/#!9/8c80ef/1

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете попробовать это.

попытаться сделать номер заказа подзапросом, который order by point desc.

, тогда получите только 2 верхних строки каждой командой, если вы хотите получить другой номер top, просто измените число в предложении where.

CREATE TABLE `People` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `team` varchar(20) NOT NULL,
  `point` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `People` (`id`, `name`, `team`, `point`) VALUES
(1, 'Luc', 'Jupiter', 10),
(2, 'Marie', 'Saturn', 0),
(3, 'Hubert', 'Saturn', 0),
(4, 'Albert', 'Jupiter', 50),
(5, 'Lucy', 'Jupiter', 50),
(6, 'William', 'Saturn', 20),
(7, 'Zeus', 'Saturn', 40);

ALTER TABLE `People`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `People`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;

Запрос 1 :

SELECT team,avg(point) totle
FROM People t1 
where (
      select count(*) 
      from People t2
      where t2.id >= t1.id and t1.team = t2.team
      order by t2.point desc
  ) <=2  ## if you want to get other `top` number just modify this number
group by team

Результаты :

|    team | totle |
|---------|-------|
| Jupiter |    50 |
|  Saturn |    30 |
0 голосов
/ 31 августа 2018

Это боль в MySQL. Если вы хотите получить два максимальных значения point , вы можете сделать:

SELECT p.team, AVG(p2.point)
FROM people p
WHERE p.point >= (SELECT DISTINCT p2.point
                  FROM people p2
                  WHERE p2.team = p.team
                  ORDER BY p2.point DESC
                  LIMIT 1, 1  -- get the second one
                 );

Связи делают это непросто, и ваш вопрос не ясно, что с ними делать.

...