IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Récupérer deux derniers résultats par date pour chaque référence


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut Récupérer deux derniers résultats par date pour chaque référence
    Bonjour,

    j'ai une table composée d'une référence, d'un montant et d'une date pour chaque entrée

    ref|montant|date|

    j'aimerais créer une requête qui retour pour chaque référence les deux derniers montants avec leurs prix respectifs (pour export tel quel dans un fichier excel via un outil ETL) :

    ref|dernierMontant|dernierMontant_Date|avDernierMontant|avDernierMontant_date

    Avez-vous une idée de comment faire ça ?

    Il s'agit d'une table où il y a énormément d'entrées.

    Merci d'avance pour votre aide,

  2. #2
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Salut,

    mmmh pourrais-tu en dire un peu plus sur la structure de ta base.
    Je suis pas sûr de bien comprendre ce que tu veux et comment est foutu ta base...
    Quand tu parles de récupérer les montants, ceux-ci sont dans une autre tables ? Si non, je ne comprends pas trop !

    pour les deux derniers montants, je peux pas te donner la réponse desuite, j'ai un trou !

    Mais pour avoir le dernier, je pense que ça donnerait quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.*, b.*
    FROM ta_base.ta_table, ta_base.reference_table
    WHERE a.id IN
    (SELECT MAX(a1.id)
    FROM ta_base.reference_table
    group by a1.id)
    Bon je suis pas très frais la de suite, ça fonctionnera pas ! Ou alors gros coup de bol !
    Je comprends pas trop la structure de ta base mais je pense qu'il faudra que tu fasses comme dans mon exemple, tu sélectionne ce dont tu as besoin, et un sous-select avec un max(id) (pour récupérer le dernier résultat), sinon pour avoir les 2 derniers... un count peut-être ?

    Je suis loin d'être un expert BDD !!

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Bonjour,

    Sous MySQL, il n'y a pas 36 façons de traiter ce genre de question.
    Inspire-toi de la solution présentée dans les sources MySQL.

    Attention, les performances risquent d'être moyennes si la table est grosse.

    ced

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une piste de réponse en appliquant la technique donnée dans ce code source.
    Par contre, la présentation que tu cherches à avoir est de la cosmétique et n'est normalement pas le boulot du SGBD. Ça demande de faire une auto-jointure du résultat donc ça alourdit encore la requête.

    Ça pourrait donner quelque chose dans le genre pour la requête de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.ref, t1.montant, t1.la_date
    FROM la_table t1
    WHERE (
        SELECT COUNT(*)
        FROM la_table t2
        WHERE t2.ref = t1.ref
            AND t2.la_date < t1.la_date
    ) < 2
    Je te laisse chercher pour la cosmétique.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Une piste de réponse en appliquant la technique donnée dans ce code source.
    Par contre, la présentation que tu cherches à avoir est de la cosmétique et n'est normalement pas le boulot du SGBD. Ça demande de faire une auto-jointure du résultat donc ça alourdit encore la requête.

    Ça pourrait donner quelque chose dans le genre pour la requête de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.ref, t1.montant, t1.la_date
    FROM la_table t1
    WHERE (
        SELECT COUNT(*)
        FROM la_table t2
        WHERE t2.ref = t1.ref
            AND t2.la_date < t1.la_date
    ) < 2
    Je te laisse chercher pour la cosmétique.
    Hélas, cela ne fonctionne pas (et ne peut fonctionner ?)

    J'imaginais dans un premier temps quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM historique
    WHERE date IN (SELECT date FROM historique GROUP BY date LIMIT 2)
    ORDER BY code_article;
    pour récupérer toutes les données mais ça ne marche pas car le LIMIT n'est pas accepté dans les sous requêtes

    Le deuxième temps aurait été d'arriver à mettre les deux résultats d'une même date sur la même ligne de résultat comme expliqué plus haut, peut-être en jouant sur un CASE WHEN MIN() THEN date1 WHEN MAX() THEN date2

    Est-ce que ça vous donne des idées ?

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    et en quoi cela ne fonctionne pas? cela te retourne des mauvais resultats?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    et en quoi cela ne fonctionne pas? cela te retourne des mauvais resultats?
    non : "this version of MySQL doesn't support LIMIT & IN/ALL/ANY/SOME subquery"

    merci pour vos réponses et votre aide

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ton "cela ne fonctionne pas" venait juste après ma requête. Le message d'erreur que tu donnes résulte de ta requête.

    Qu'est-ce qui ne fonctionne pas dans ma requête, adaptée bien sûr à ta structure de données ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/08/2010, 16h03
  2. Réponses: 2
    Dernier message: 23/06/2009, 13h36
  3. Réponses: 16
    Dernier message: 03/06/2009, 05h14
  4. min(date) pour chaque patient
    Par leyee dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/09/2007, 10h49
  5. Classer des résultats par date/heure
    Par PedroBD dans le forum Langage SQL
    Réponses: 12
    Dernier message: 27/11/2006, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo