Maison > base de données > tutoriel mysql > le corps du texte

Comment récupérer les N premières valeurs maximales d'une table MySQL, regroupées par une colonne spécifique ?

Linda Hamilton
Libérer: 2024-11-10 05:33:02
original
196 Les gens l'ont consulté

How do you retrieve the top N maximum values from a MySQL table, grouped by a specific column?

Récupération des N premières valeurs maximales d'une table MySQL

Une tâche courante dans l'analyse des données consiste à sélectionner les n premières valeurs maximales pour une colonne spécifique d'une table. Considérez le tableau suivant :

column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar

Énoncé du problème :

Pour une valeur donnée de n, récupérez les n premières valeurs maximales pour la colonne 1, regroupées par la colonne 2. Dans l'exemple ci-dessus, pour n=2, le résultat souhaité serait :

column1
3
4
7
8

Solution :

Alors qu'une approche simple pourrait impliquer de regrouper les lignes par colonne2 et en sélectionnant la valeur maximale pour chaque groupe, cela ne renverrait que la valeur maximale absolue pour chaque groupe. Pour récupérer les n premières valeurs, une approche plus avancée est nécessaire.

Approche basée sur UNION :

Une approche consiste à utiliser une clause UNION pour combiner plusieurs requêtes que chacune sélectionnez la valeur maximale pour un autre groupe. Pour n = 2, la requête suivante suffirait :

SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2)
Copier après la connexion

Approche basée sur le classement :

Pour des valeurs n plus flexibles, une approche basée sur le classement peut être employé. Cela implique d'attribuer un classement à chaque ligne en fonction de la valeur de la colonne 1, puis de sélectionner les lignes présentant les n premiers rangs. La requête suivante implémente cette approche :

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid
Copier après la connexion

Remplacez 'grouper' par le nom de la colonne group-by et 'val' par la colonne contenant les valeurs.

La sous-requête dans le La clause LIMIT définit la nième valeur classée pour chaque groupe. Les lignes avec des valeurs supérieures à cette nième valeur classée sont ensuite sélectionnées.

Conclusion :

Les deux approches fournissent des méthodes efficaces pour sélectionner les n premières valeurs maximales d'un tableau, chacune avec ses propres forces et limites. L'approche basée sur les unions est simple et robuste, tandis que l'approche basée sur les classements offre une flexibilité dans la spécification du nombre de valeurs maximales à récupérer.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal