1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

AIDE [SQL] TOP 3 multiple

Discussion dans 'Base de donnés & HFSQL' créé par *!vince!*, Juin 12, 2019.

Tags:
  1. *!vince!*

    *!vince!* Member

    Inscrit:
    Juin 26, 2018
    Messages:
    62
    J'aime reçus:
    26
    Bonjour à tous,

    Je vous sollicite pour une requête SQL.

    Voici le type de données :

    ID Année
    x 2009
    x 2008
    x 2007
    x 2006
    x 2005
    x 2004
    x 2003

    y 2019
    y 2018
    y 2017
    y 2016
    y 2015
    y 2014

    z 2017
    z 2016
    z 2015
    z 2014



    Ce que je cherche à faire c'est : Récupérer les 3 dernières années pour chaque ID.
    exemple dans ce cas :

    ID Année
    x 2009
    x 2008
    x 2007

    y 2019
    y 2018
    y 2017

    z 2017
    z 2016
    z 2015


    Avez-vous déjà rencontré ce cas, si oui, comment l'avez vous résolu.

    ce doit être quelque chose du type requête imbriqué avec un GROUP BY et un TOP 3 mais je n'y arrive pas.

    SELECT TOP 3
    Table.ID
    FROM
    Table
    GROUP BY
    ID
    ORDER BY
    Table.Année
     
    Tags:
  2. *!vince!*

    *!vince!* Member

    Inscrit:
    Juin 26, 2018
    Messages:
    62
    J'aime reçus:
    26
    Bon, j'ai fait un truc moche mais fonctionnel

    1) J'ajoute une colonne avec un booléen à ma table

    2) je fais une requete avec un DISTINCT sur l'ID de ma table

    [windev]SELECT DISTINCT
    Table.ID AS ID
    FROM
    Table[/windev]

    :relievedface: Je fais une requete avec un TOP 3 et un parametre sur l'ID

    [windev]SELECT TOP 3
    Table.ID AS ID,
    Table.Année AS Année,
    Table.Booléen AS Booléen
    FROM
    Table
    WHERE
    Table.ID= {ParamID}
    ORDER BY
    Année DESC[/windev]

    4) Je modifie la colonne booléenne

    [windev]HExécuteRequête(REQ_Distinct)
    POUR TOUT REQ_Distinct
    REQ_TOP3.ParamID = REQ_Distinct.ID
    HExécuteRequête(REQ_TOP3,hModifieFichier)
    POUR TOUT REQ_TOP3
    REQ_TOP3.Booléen= 1
    HModifie(REQ_TOP:relievedface:
    FIN
    FIN[/windev]

    5) Une dernière requête pour l'affichage

    [windev]SELECT
    Table.ID AS ID,
    Table.Année AS Année,
    Table.Booléen AS Booléen
    FROM
    Table
    WHERE
    Booléen = 1
    ORDER BY
    Année DESC
    ID ASC[/windev]



    Un meilleur code est le bienvenue : )
     
  3. PhantomX

    PhantomX Member

    Inscrit:
    Juil 11, 2018
    Messages:
    78
    J'aime reçus:
    61
    Bonjour

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ,
    pour faire une requête simple, je ne vois pas comme ça.

    Par contre j'irais plutôt avec une boucle pour parcourir tout tes ID
    Je prends en considération que ton ID est un entier pour facilité ici, reste à adapté.

    J'irais avec 2 requêtes

    Code (Windev):

    // Ton distinct est correct
    ***REQ_DistinctID***
    SELECT DISTINCT
        Table.ID AS ID
    FROM
        Table

    ***REQ_TOP3***
    SELECT TOP 3
        Table.ID as ID,
        Table.Annee as Annee
    FROM
        Table
    WHERE
        Table.ID = {pID}
    ORDER BY
        Annee DESC

    // pour ce qui est du code

    tId est un tableau d'entier

    stResultat est une structure
        Id est un entier
        Annee est un entier
    FIN

    tMonResultat est un tableau de stResultat  // celui-ci pourra être utilisé pour manipuler l'IHM
    tTemp est un tableau de stResultat // tableau temporaire

    // boucle pour ajouter les id dans une table (pas nécessaire mais j'aime mieux travailler avec des tableau pour me boucle :P)
    POUR TOUT REQ_DistinctID
        tId.ajoute(REQ_DistinctID.ID)
    FIN

    // Exécution de la requête top 3 pour chaque ID de notre tableau
    POUR TOUT id DE tId
        REQ_TOP3.pID = id
        HexecuteRequete(REQ_TOP3)

        // récupération des données dans un tableau mémoire
       

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (tTemp, REQ_TOP3)

       // ajout du tableau temporaire à notre tableau de résultat
        POUR TOUT r de tTemp
            tMonResultat.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (r)
        FIN
    FIN
     
    Tout tes ID est tes années sont maintenant stocké dans ton tableau stResultat que tu peux manipuler pour ton IHM.

    L'avantage de le faire ainsi est que c'est facile d'exécuter la boucle de requête REQ_TOP3 en tâches parallèles et d'amélioré les performances dépendant du nombre d'ID que tu as. Si tu en a 3-4 ca vaut pas la peine, mais si tu en a plusieurs ceci paraitra énormément.

    Espérant t'avoir aidé :)
     
    *!vince!* apprécie ceci.
  4. *!vince!*

    *!vince!* Member

    Inscrit:
    Juin 26, 2018
    Messages:
    62
    J'aime reçus:
    26
    Oui, merci.
    Excellente ID de mettre les ID dans un tableau pour faire une tâche parallèle.
     

Partager cette page

Chargement...