1. Помогите, пожалуйста. Я проверил много примеров на этом форуме без успеха.

Этот сценарий работает отлично, но теперь я хочу ограничить суммарные оценки раундов лучшими 14 раундами.

SELECT 
RoundScoreCard.idPlayerDetails as ID,
#concat(PlayerFirstName," ",PlayerLastName)as Name,
sum(RoundScoreCardPlayerPoints) as Total 

from RoundScoreCard 

join PlayerDetails on RoundScoreCard.idPlayerDetails = PlayerDetails.idplayerdetails 
group by RoundScoreCard.idPlayerDetails 
order by Total DESC 

Тест с этим единственным подзапросом работает нормально;

select sum(RoundScoreCardPlayerPoints) 
FROM 
(select RoundScoreCardPlayerPoints
from RoundScoreCard
where RoundScoreCard.idPlayerDetails = @player 
order by RoundScoreCardPlayerPoints desc 
limit 14) as subquery
;

Боролся около недели, модифицируя все примеры, которые смог найти, но никак не могу заставить это работать со списком всех игроков. Я могу показать множество попыток, но это запутает других. (У меня есть решение с использованием проверки на наличие записей, а затем оператора IF, но это кажется чрезмерным и затратным по времени)

.
  1. Также; из интереса, возможно ли иметь несколько предельных утверждений? Например, что если мне нужны только 3 лучших игрока с их лучшими 14 результатами из всех раундов?

Пример http://sqlfiddle.com/#!9/f393a6/3

Всего наилучшего в новом году.


OK - итак, я продвинулся немного дальше с помощью этой статьи; https://www.databasejournal.com/features/mysql/selecting-the-top-n-results-by-group-in-mysql.html

Спасибо Роб Гравелл

Ограничение моих лучших оценок до 2 для каждого игрока

Мой Sql теперь выглядит следующим образом:

Select idRoundScorecard, RoundScoreCardPlayerPoints,idPlayerDetails
 FROM
 (
   SELECT idRoundScorecard, RoundScoreCardPlayerPoints, idPlayerDetails,
   @player_score_rank := IF(@current_player = idPlayerDetails, 
                         @player_score_rank + 1, 
                         1
                      ) AS player_score_rank,
   @current_player := idPlayerDetails
   FROM RoundScoreCard
    ORDER BY idPlayerDetails, RoundScoreCardPlayerPoints DESC
 ) ranked
 WHERE player_score_rank <= 2;

Сейчас мне придется снова подводить итоги и ранжировать?

ereceles

Ответов: 2

Ответы (2)

Вот мое решение http://sqlfiddle.com/#!9/4f4fe7/9

select idPlayerDetails as ID, concat(PlayerFirstName," ",PlayerLastName)as Name,sum(Points) as Points
from
(Select idRoundScorecard, RoundScoreCardPlayerPoints as Points,idPlayerDetails
 FROM
 (SELECT idRoundScorecard, RoundScoreCardPlayerPoints, idPlayerDetails,
   @player_rank := IF(@current_player = idPlayerDetails, 
                         @player_rank + 1, 
                         1
                      ) AS player_rank,
   @current_player := idPlayerDetails
   FROM RoundScoreCard
    ORDER BY idPlayerDetails, RoundScoreCardPlayerPoints DESC
 ) ranked
 WHERE player_rank <= 5 )summed
natural join PlayerDetails
group by idPlayerDetails
order by Points desc
 ;

Я ошибся с rank(), нужно было row_number()


With scores as (
  SELEct
RoundScoreCard.idPlayerDetails as ID,
RoundScoreCardPlayerPoints As pts,
Dense_rank() Over (Partition by idPlayerDetails
            Order by RoundScoreCardPlayerPoints  Desc) As rK,
Row_number() Over (Partition by idPlayerDetails
            Order by RoundScoreCardPlayerPoints  Desc) As rn
from RoundScoreCard 
)
select id, sum(pts) from scores
Where rn < 3
group by id;

Получает сумму двух лучших раундов.

смотрите db fiddle

.

2022 WebDevInsider