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

Langage SQL Discussion :

Sélection de la dernière ligne parmi tant d'autres


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2018
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 33
    Points : 2
    Points
    2
    Par défaut Sélection de la dernière ligne parmi tant d'autres
    Salut la famille,

    Quelqu'un peut m'aider a faire cette requête ?

    Voici l'exemple de ma table :

    montant | devise
    -----------------------
    500 | $
    200 | £
    350 | £
    600 | $
    650 | $

    REQ 1 : J'aimerais récupérer la dernière d (£)
    REQ 2 : la dernière d ($)

    Comment faire ?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour répondre, il faut que tu nous expliques ce qui caractérise la "dernière" ligne.
    Car pour avoir une première ligne, une dernière ligne, il faut un tri, et je ne vois pas comment trier les lignes ici.

    Tatayo

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Je rejoins tatayo.

    Dans le principe :

    SELECT ALL montant
    FROM ta_table
    WHERE devise = '$'
    ORDER BY <ton critère de tri> DESC
    LIMIT 1 -- Ici ça peut différer selon ton SGBD
    ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2018
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Pour répondre, il faut que tu nous expliques ce qui caractérise la "dernière" ligne.
    Car pour avoir une première ligne, une dernière ligne, il faut un tri, et je ne vois pas comment trier les lignes ici.

    Tatayo
    Merci pour ta réaction,
    oft j'ai une table qui enregistre des montants avec devises, dans cette table je mélange 2 devises ($ et £), mon souhait est que si je dois enregistrer un nouveau montant par exemple en $, que je prenne
    le denier montant en $ enregistré ds la bdd et l'addition avec le nouveau.

    voilà la raison de ma question

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Ok, mais on ne sait toujours pas comment trier les lignes, il n'y a aucune colonne dans la table qui permet de faire ce tri.
    Les lignes d'une table ne sont pas "rangées" dans la base, il n'y a pas de notion de première ou dernière ligne.

    Si je prends 2 lignes au hasard, qu'est-ce qui me permet de savoir quelle ligne vient avant l'autre ?

    Peux-tu nous donner la structure exacte de la table en question ?

    Tatayo

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    j'ai une table qui enregistre des montants avec devises, dans cette table je mélange 2 devises ($ et £), mon souhait est que si je dois enregistrer un nouveau montant par exemple en $, que je prenne
    le denier montant en $ enregistré ds la bdd et l'addition avec le nouveau.
    Pour moi le critère d'ordonnancement serait l'ID représentant la dernière insertion dans la base de données.

    En utilisant la requête de @Séb, on peut préciser,

    Pour le reste c'est une addition entre le résultat de cette requête et le montant à ajouter, puis on insère le montant total dans la BDD.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    mon souhait est que si je dois enregistrer un nouveau montant par exemple en $, que je prenne
    le denier montant en $ enregistré ds la bdd et l'addition avec le nouveau.
    Tu parles de "dernier enregistrement" => Il faut donc horodater les insertions, on fait ça avec une colonne DATETIME

    Tu veux faire un cumul ? Généralement on n'enregistre pas des résultats de calcul en bdd, mais les données "primaires". Ensuite tu affiches le résultat du calcul au besoin.

    operation
    ---------------
    id		-- auto-incrément
    amount		-- montant
    currency_id	-- devise, clef étrangère vers currency.id
    created_at	-- hododatage création
    
    currency
    ---------------
    id
    code		-- Euro = EUR
    number		-- Euro = 978
    name		-- Euro
    symbol		-- Euro = €
    Montants cumulés par devise :

    SELECT ALL
        c.code AS "Code devise", c.name AS "Devise",
        SUM(o.amount) AS "Montant cumulé", MAX(o.created_at) AS "Dernière insertion"
    FROM operation AS o
    INNER JOIN currency AS c ON o.currency_id = c.id
    GROUP BY 1, 2
    ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Pour moi le critère d'ordonnancement serait l'ID représentant la dernière insertion dans la base de données.
    Rien ne permet d'affirmer que les ID, même déclarés en auto-incrément, sont attribués de manière logique.
    Certains SGBD répartis ou pratiquant la parallélisation des traitements attribuent leurs ID par plages en fonction des processeurs qui traiteront la ligne insérée.
    Seul l'horodatage à la microseconde, voire la nanoseconde, pourrait permettre alors d'identifier clairement l'ordre d'insertion des lignes...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Rien ne permet d'affirmer que les ID, même déclarés en auto-incrément, sont attribués de manière logique.
    Certains SGBD répartis ou pratiquant la parallélisation des traitements attribuent leurs ID par plages en fonction des processeurs qui traiteront la ligne insérée.
    Seul l'horodatage à la microseconde, voire la nanoseconde, pourrait permettre alors d'identifier clairement l'ordre d'insertion des lignes...
    Je suis tout à fait d'accord, mais je ne pense pas que le PO prévoit l'ajout d'une colonne, je ne vois donc que l'ID auto incrémenté comme solution.
    Mais si il a cette possibilité ou s'il souhaite tout simplement cette solution, c'est effectivement la solution à préconiser.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2018
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Tu parles de "dernier enregistrement" => Il faut donc horodater les insertions, on fait ça avec une colonne DATETIME

    Tu veux faire un cumul ? Généralement on n'enregistre pas des résultats de calcul en bdd, mais les données "primaires". Ensuite tu affiches le résultat du calcul au besoin.

    operation
    ---------------
    id		-- auto-incrément
    amount		-- montant
    currency_id	-- devise, clef étrangère vers currency.id
    created_at	-- hododatage création
    
    currency
    ---------------
    id
    code		-- Euro = EUR
    number		-- Euro = 978
    name		-- Euro
    symbol		-- Euro = €
    Montants cumulés par devise :

    SELECT ALL
        c.code AS "Code devise", c.name AS "Devise",
        SUM(o.amount) AS "Montant cumulé", MAX(o.created_at) AS "Dernière insertion"
    FROM operation AS o
    INNER JOIN currency AS c ON o.currency_id = c.id
    GROUP BY 1, 2
    ;
    Merci beaucoup je v essayer, ça marche merci infiniment

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je suis tout à fait d'accord, mais je ne pense pas que le PO prévoit l'ajout d'une colonne, je ne vois donc que l'ID auto incrémenté comme solution.
    Une solution n'est valable que si elle est fiable à 100%, or, comme l'a justement expliqué AL1__24, la valeur d'un identifiant attribuée par le SGBD (auto_increment, identity ou autre selon le SGBD) n'est pas toujours chronologique, il y a de nombreuses exceptions. Donc NON l'utilisation d'un identifiant auto_incrémenté n'est pas une solution envisageable.

    Les différentes solutions applicables pour ce type de besoin sont expliquées dans mon blog, voir ICI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-365] VBA sélection de la dernière ligne
    Par sorbetframboise dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 10/03/2021, 16h33
  2. Réponses: 1
    Dernier message: 22/07/2014, 12h07
  3. Réponses: 8
    Dernier message: 01/04/2011, 11h04
  4. [MySQL] Un problème de numérotation d'un résultat parmi tant d'autres
    Par MisterMacPhisto dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 26/04/2007, 13h45
  5. exécuter une fonction parmi tant d'autres
    Par chrix10.2 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2006, 09h39

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