SQL – SUM, Distinct et TOP 4

J'ai une requête pour une table que je ne peux pas travailler.

Voici des exemples de arrays;

Membres de la table:

|ID|NAME| |1 |John| |2 |Joe | |3 |Paul| 

Scores de table:

 |ID |Score | |1 | 25 | |1 | 34 | |2 | 54 | |1 | 23 | |3 | 43 | |2 | 14 | |1 | 23 | |3 | 43 | |3 | 14 | |3 | 43 | |2 | 14 | |1 | 23 | |3 | 43 | |3 | 14 | 

Je veux afficher le nom des membres, puis additionner les deux meilleurs scores et les afficher avec le plus grand score SUM'd en premier.

 |Paul| 86 | |Joe | 68 | |John| 57 | 

Merci d'avance

Vous pouvez utiliser la fonction de la ligne row_number pour atteindre les scores TOP 2 par id, puis l'additionner en utilisant group by et enfin join la table MEMBERS, quelque chose comme:

 select MEMBERS.name, tt.s from MEMBERS inner join ( select ID, sum(Score) s from ( select ID, Score, row_number() over(partition by ID order by Score desc) rn from SCORES ) t where rn <= 2 group by id )tt on MEMBERS.id = tt.id ORDER BY tt.s 

Vous pouvez utiliser une clause group by et une sous-sélection

 SELECT M.NAME ,(SELECT SUM(S2.SCORE) FROM (SELECT TOP 2 S1.Score FROM SCORES S1 WHERE S1.ID = S.ID ORDER BY S1.Score DESC) AS S2 ) AS Two_Highest_Scores FROM SCORES S LEFT JOIN MEMBERS M ON M.ID = S.ID GROUP BY M.ID ,M.NAME 

Pouvez-vous tester cela?

Essayez cette requête (SQL Server 2012+ requirejs)

 SELECT name, best_score FROM ( SELECT id, score , SUM(score) OVER (PARTITION BY id ORDER BY score DESC ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS best_score , ROW_NUMBER() OVER (PARTITION BY id ORDER BY score DESC) AS row_num FROM Scores ) AS t INNER JOIN Members AS m ON (m.id = t.id AND t.row_num = 1) ORDER BY best_score DESC; 

Premièrement, pour chaque identifiant, les scores sont classés par ordre décroissant.

 (PARTITION BY id ORDER BY score DESC) 

Alors SUM () est utilisé sur le score de la ligne courante et la ligne 1 suivante par la clause ROWS

 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING 

La requête interne renvoie donc la sum combinée de 2 scores pour chaque ligne. Ensuite, le premier numéro de ligne est utilisé pour get la ligne best_score. GROUP BY pourrait également être utilisé à la place.