Faq/Base/140/fr

From The Document Foundation Wiki
< Faq‎ | Base
Jump to: navigation, search

Comment limiter le nombre de résultats d'une requête groupée ?

Une requête groupe les données sur les valeurs d'un champ. On souhaite ne conserver que les n premiers enregistrements sélectionnés pour chaque groupe.


La FAQ Comment limiter le nombre de résultats d'une requête ? présente comment limiter le nombre d'enregistrements mais cette technique ne peut s'appliquer ici car il ne s'agit pas de sélectionner les n premiers enregistrements retournés par la requête mais les n premiers enregistrements par groupe.

La requête ci-dessous groupe par mois et limite le nombre d'enregistrements à 3 par groupe :

copie d'écran requête en mode SQL
Pour sélectionner les trois premiers enregistrements par groupe

Nota

  1. Ce type de requête doit être écrit en mode SQL (le mode ébauche ne le permet pas). Commencer en mode ébauche pour sélectionner tables et champs, puis passer en mode SQL pour ajouter le reste, est une astuce permettant d'éviter la saisie des noms toujours risque d'erreur.
  2. Tout se gère par jointure de la table sur elle-même.
    • Une jointure sur le mois et les montants inférieurs ou égaux à l'enregistrement courant,
    • Un groupement calculant le nombre d'enregistrements sélectionnés,
    • Une sélection sur ce nombre en fonction du nombre désiré par groupe (3 dans l'exemple).
  • Le SQL correspondant :
SELECT "c"."Mois", "c"."Montant", "d"."Rang" FROM "Table1" AS "c" 
INNER JOIN ( 
        SELECT "a"."ID", COUNT( * ) AS "Rang" FROM "Table1" AS "a" 
                INNER JOIN "Table1" AS "b" ON ( "a"."Mois" = "b"."Mois" ) AND ( "a"."Montant" <= "b"."Montant" ) 
                GROUP BY "a"."ID" 
                HAVING COUNT( * ) <= 3 
                ) AS "d" ON ( "c"."ID" = "d"."ID" ) 
ORDER BY "c"."Mois", "d"."Rang"