Как я могу выбрать строку с MAX (значение) из производной таблицы, где все значения являются рассчитанными суммами? - PullRequest
1 голос
/ 28 марта 2020

Я попробовал следующий код, но я просто получаю полную таблицу со всеми именами и значениями суммы вместо одной строки с максимальным значением:

SELECT stageName, max(total_salary)
FROM (
      SELECT c.*, sum(p.dailySalary) as total_salary        
      from contender as c
      left join participant as p
      on (p.contender = c.idContender)
      group by c.idContender ) b
group by stageName;
output: 
Yellow Jesters  205
TikTok  3073
Teabags 947
Bobbleheads 11840
Reddit  1486

, но мне просто нужно: Bobbleheads 11840

PS: Пожалуйста, предложите решение БЕЗ использования des c и limit

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Если вы просто хотите занять верхнюю строку в вашем наборе результатов, вы можете отсортировать и ограничить:

select c.*, sum(p.dailySalary) as total_salary        
from contender as c
left join participant as p on p.contender = c.idContender
group by c.idContender
order by total_salary desc
limit 1

Если есть возможность верхней t ie, и вы хотите разрешить ее, вы можете использовать оконные функции:

select *
from (
    select 
        c.*, 
        sum(p.dailySalary) as total_salary, 
        rank() over(order by sum(p.dailySalary) desc) rn
    from contender as c
    left join participant as p on p.contender = c.idContender
    group by c.idContender
) t
where rn = 1
0 голосов
/ 28 марта 2020

Вот решение, которое должно работать на любой версии MySQL 5.x, без использования ORDER BY, LIMIT, оконных функций, представлений или CTE.

SELECT a.stagename, a.total_salary
FROM (
      SELECT c.*, sum(p.dailySalary) as total_salary        
      from contender as c
      left join participant as p
      on (p.contender = c.idContender)
      group by c.idContender ) AS a
LEFT OUTER JOIN (
      SELECT c.*, sum(p.dailySalary) as total_salary        
      from contender as c
      left join participant as p
      on (p.contender = c.idContender)
      group by c.idContender ) AS b
  ON a.total_salary < b.total_salary
WHERE b.total_salary IS NULL;

Протестировано на MySQL 5.7 .27.

Вывод:

+-------------+--------------+
| stagename   | total_salary |
+-------------+--------------+
| Bobbleheads |        11840 |
+-------------+--------------+
...