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

DB2 Discussion :

Dernier enregistrement d'une colonne


Sujet :

DB2

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Dernier enregistrement d'une colonne
    Bonjour, je tente actuellement de récupéré le derniere enregistrement d'une colonne venant d'une table, mais je n'y parvien pas..
    Voici mon code a la base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  ColonneA,         
                 ColonneB,        
                 ColonneC,          
                 ColonneA                                    
      FROM  TableA                         
    
      WHERE                                
       ColonneB = 'ABC'
    Le premier champ du select (colonneA) comporte le nombre total de transaction.
    Le problème c'est que j'ai besoin de ré-inséré la colonneA dans le select pour cette fois-ci récupéré la derniere transaction.

    J'ai vue qu'il éxistait WHERE = MAX(COLONNEA) mais je retrouve 2 fois la colonneA dans le select donc sa ne marche pas.
    Est-ce que quelqu'un pourrai m'aidé? je ne sais pas j'ai été asser clair..

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Pas compris ce que tu voulais faire ...

    Pour moi, le dernier enregistrement d'un colonne ça n'a pas de sens en relationnel ...

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Effectivement la notion de dernier n'est pas très claire...

    Soit on recherche la dernière occurrence insérée, donc le dernier d'un point de vue temporel, dans ce cas il faut disposer d'une colonne d'horodatage suffisamment fine (ex : un timestamp) pour permettre de trouver la ligne la plus récente.

    Soit on recherche l'occurrence ayant la valeur la plus faible, donc le dernier d'un point de vue classement

    Dans les deux cas plusieurs solutions possibles
    - utilisation d'une fonction d'aggrégation
    - utilisation d'une requête correlée avec (not) exists
    - utilisation d'une fonction OLAP de classement telle que RANK ou DENSE_RANK
    etc...

    Mon blog propose plusieurs solutions SQL pour rechercher la ligne la plus récente, voyez ICI

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Enfaite je veux récupéré la dernier montant(colonne) le plus récent à partir d'une colonne auto increment(qui defini l'ordre ex: 1,2,3,4,5) venant d'une autre table.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Il ne faut JAMAIS utiliser une colonne de type "generated as identifier" (auto-incrément ou auto-décrément, n'oubliez pas que l'incrément n'est qu'une des deux options possibles) pour en déduire une chronologie !

    Les développeurs tombent souvent dans le piège de croire que les colonnes "generated as identifier" sont insérées dans l'ordre chronologique, car, en environnement de développement peu concurrentiel avec très peu de threads actifs en parallèle, c'est souvent vrai. Mais ce n'est certainement pas une règle !

    La valeur de l'identifiant, quand elle est attribuée par le SGBD, n'est pas frocément chronologique pour les raisons suivantes.

    Le plus souvent, afin de limiter les accès au moteur de la base de données, les prochaines valeurs à insérer sont réservées par plages (par défaut plage de 20 valeurs pour DB2)
    quand un thread veut insérer une colonne, il "récupère" la prochaine valeur dispo dans ce pool, mais l'indentifiant n'est effectivement ajouté que lors du COMMIT.
    Or, plusieurs threads parallèles peuvent réserver des identifiants, mais rien ne garantit que les COMMIT seront fait dans l'ordre des réservations.
    Même si l'on paramètre le SGBD pour ne pas réserver de plages, on n'est pas à l'abri de ce phénomène.

    Par ailleurs, si la colonne identifiante est de type "GENERATED BY DEFAULT", il est tout à fait possible que quelqu'un insère un identifiant en communiquant la valeur en s'insérant dans un "trou" (entre deux valeurs utilisées). Le paramétrage de la valeur d'incrément ou de décrément permet de choisir d'autres valeurs que 1 ce qui laisse de la place. De plus, les threads non commités ont réservé des valeurs qui ne seront jamais utilisées ce qui crée d'autres "trous".

    C'est la raison pour laquelle il faut une colonne d'horodatage pour connaitre l'ordre d'insertion.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Effectivement, c'est bien une colonne d'horodatage.

    Par contre je n'est toujours pas réussi a réglé mon problème.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 142
    Points
    142
    Par défaut
    Bonjour.

    Je ne suis pas sûr d'avoir compris le problème, mais en triant sur la colonne horodatage et en limitant le nombre de résultats on peut récupérer l'enregistrement le "plus récent" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Champs FROM MaTable
    WHERE Condition
    ORDER BY Horodatage DESC
    FETCH FIRST 1 ROW ONLY

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    J'ai reussi finalement avec un ORDER BY ORDRE DESC, DATE DESC

    Mon problème maintenant est de prendre cette requete et l'inséré dans un autre select qui contient deja la même colonne, meme table, mais qui ne contient pas la même valeur.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Si vous aviez consulté mon blog, comme je vous le proposais ici :
    Citation Envoyé par escartefigue Voir le message
    Mon blog propose plusieurs solutions SQL pour rechercher la ligne la plus récente, voyez ICI
    vous auriez su qu'il ne faut pas utiliser d'identity column pour votre besoin et vous auriez trouvé des solutions SQL plus efficientes que celle que vous avez choisie.
    Utiliser un tri est rarement la solution la plus performante

Discussions similaires

  1. Recherche de l'avant dernier enregistrement dans une colonne !
    Par Tony4152 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/03/2017, 21h32
  2. [AC-2007] Affichage du dernier enregistrement d'une colonne dans une TxtBox
    Par Iron_dams dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/11/2016, 16h09
  3. Réponses: 6
    Dernier message: 29/08/2014, 13h32
  4. Réponses: 10
    Dernier message: 01/08/2003, 13h45
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 14h54

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