3 votes

Requête pour le score total

Tableau d'entrée : Soumissions

Submission contient quatre colonnes, Contestant_id indique l'id de différents concurrents qui soumettent contre différents problèmes. Un concurrent peut soumettre contre un problème plus d'une fois. Ainsi, challenge_id peut apparaître plus d'une fois contre un Contestant_id.

 submission_id  Contestant_id challenge_id    score
    11                 1             333        90
    22                 2             333        60
    33                 3             333        80
    44                 4             333         0
    112                1             333        45
    113                1             444        80
    114                2             444        70

Tableau de sortie : Score total

Contestant_id     score 
    1              170
    2              130
    3               80 

Ici, nous prenons le score total comme

 for contestant_id 1 :  total score = max(90,45)+ 80 = 170
 for contestant_id 2 :  total score = 60 + 70 = 130
 for contestant_id 3 :  total score = 80 
 for contestant_id 4 :  total score = 0 ;so we exclude it 

pour prendre le score total, je dois prendre le maximum d'un seul contestant_id, s'il y a plus d'un même contest_id, alors prendre une somme.Mais, je suis bloqué à ce sujet, comment faire.

Select Contestant_id,Score as (Sélectionnez la somme (max(Select .... )

2voto

Gordon Linoff Points 213350

Vous semblez avoir besoin de deux niveaux d'agrégation. Vous avez besoin du score maximum pour chaque concurrent et chaque défi. Puis vous voulez les additionner.

Voici une méthode :

select Contestant_id, sum(max_score)
from (select Contestant_id, challenge_id, max(score) as max_score
      from Submissions
      group by Contestant_id, challenge_id,
     ) t
group by Contestant_id;

Si vous voulez créer un tableau de sortie, vous pouvez ajouter into total_scores après le select .

0voto

Utilisation d'un CTE

WITH q AS
(
SELECT contestant_id, challenge_id, MAX(score) as score
FROM submissions
GROUP BY contestant_id, challenge_id
)

SELECT contestant_id, SUM(score)
FROM q
GROUP BY contestant_id
HAVING SUM(score) > 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X