Запрос Sql, чтобы найти строку, имеющую максимальную сумму для столбца - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая таблица «Счеты», в которой указано количество игроков за определенный год.

        Sid    Name     Score     Year
         1     John     500      2016
         2     Kim      900      2015
         3     Ren      300      2016
         4     John     600      2015
         5     Kim      200      2016     
         6     Ren      200      2016

Найдите игрока, набравшего максимальное количество пробежек в 2016 году.

. Найти его можно с помощьюзапрос ниже

Select   Name 
  from
     ( select Name
            , sum(Score) as sumScore 
         from Scores 
       where year=2016 
       group
         by Name
     ) sub 
  order 
    by sumScore desc 
 limit 1;

Ouput: Ren

Как я могу найти то же самое, не используя заказ по?

Я пробовал ниже, но это не такне работает, так как он не может ссылаться на sub во 2-ом месте, где оговорка и жалуется, что sub не существует

select Name from(select Name,sum(Score) as sumScore from Scores 
where year=2016 group by Name)sub where sumScore=(select max(sumScore) from sub)

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Один простой метод использует оконные функции:

select s.*
from (select s.*, max(s.score) over (partition by year) as max_score
      from scores s
      where year = 2016
     ) s
where score = max_score;
0 голосов
/ 25 октября 2018
SELECT Scores.Name, SUM(Scores.Score)
FROM (
      select Name,sum(Score) as sumScore, Years 
      from Scores 
      where Years=2016 
      group by Name, Years
     )sub INNER JOIN Scores ON sub.Name = Scores.Name
GROUP BY Scores.Name
HAVING SUM(Scores.Score) = MAX(sub.sumScore)
0 голосов
/ 25 октября 2018

Вы также можете использовать общее табличное выражение в сочетании с плотным рангом

with cte as (
    select *, 
    DENSE_RANK() OVER(ORDER BY score desc, year) rank 
    from demo 
    where year = 2016
)
select * 
from cte 
where rank = 1

Демо

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

with cte as (
    select name,year ,
    DENSE_RANK() OVER(ORDER BY sum(score) desc, year) rank 
    from demo 
    where year = 2016
    group by name,year
)
select * 
from cte 
where rank = 1

Демо

0 голосов
/ 25 октября 2018

Вы можете попробовать использовать коррелированный подзапрос

DEMO

select * from tablename a where score in 
(select max(score) from tablename b where a.year=b.year and b.year=2016)
and a.year=2016

ИЛИ вы можете использовать оконную функцию row_number (), как показано ниже

select * from 
(
select *,row_number() over(partition by yr order by score desc) as rn from cte1 
)a where rn=1 and yr=2016

ВЫХОД:

id  name    score   yr
1   John    500    2016
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...