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)
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
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!