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.