En SQL, lors de l'exécution d'une opération d'agrégation (comme trouver la valeur maximale), les colonnes utilisées pour l'agrégation doivent également apparaître dans la clause GROUP BY. Si vous ne le faites pas, l'erreur apparaîtra : "La colonne doit apparaître dans une clause GROUP BY ou être utilisée comme fonction d'agrégation".
Supposons que vous souhaitiez trouver la valeur moyenne maximale (avg) pour chaque nom de client (cname) dans le tableau :
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Cette requête renverra une erreur car wmname n'est pas inclus dans la clause GROUP BY. Pour résoudre ce problème, vous pouvez simplement regrouper par cname et wmname :
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
Cependant, cette méthode ne produit pas le résultat attendu, à savoir afficher la valeur moyenne maximale pour chaque cname unique. Au lieu de cela, il sera regroupé par cname et wmname, ce qui entraînera plusieurs lignes par cname. Pour corriger ce problème, suivez l'une des méthodes suivantes :
SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;
SELECT m.cname, m.wmname, t.mx FROM ( SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;
Les fonctions de fenêtre vous permettent d'effectuer des calculs sur les lignes d'une fenêtre spécifiée. Dans ce cas, vous pouvez utiliser la clause PARTITION BY pour regrouper par cname et calculer la valeur moyenne maximale dans chaque partition :
SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;
Cette méthode affichera tous les enregistrements, mais elle affichera correctement la valeur moyenne maximale par cname et par ligne.
Si vous souhaitez afficher uniquement les tuples uniques correspondant à la valeur moyenne maximale, vous pouvez utiliser la méthode suivante :
SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar;
SELECT DISTINCT /* distinct matters here */ m.cname, m.wmname, t.avg AS mx FROM ( SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar ) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;
Cette méthode renverra une liste de tuples uniques contenant la valeur moyenne maximale pour chaque cname. Notez l'ajout de ORDER BY avg DESC
pour garantir que le classement est par ordre décroissant en fonction de avg
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!