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

SQL Oracle Discussion :

Trouver la valeur max avec une condition


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut Trouver la valeur max avec une condition
    Bonjour,

    Je cherche à extraire d'une table adresse la dernière adresse d'une personne avec pour condition qu'un champ de l'adresse soit null.
    En faite je veux identifier tous les dossiers de personnes dont la dernière adresse est invalide.

    une adresse est invalide si un champ lb_rue_adr est a null

    j'ai utilisé cette requête, mais je n'obtient pas ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select max(id_adr),id_egst_adr 
    from adr 
    where  lb_rue_adr is null and id_egst_adr='2601627'
    group by id_egst_adr;
    id_egst_adr= id du dossier (afin de ne cibler qu'un dossier au départ pour contrôler que la requête fonctionne)
    lb_rue_adr c'est le champ qui ne doit pas être à null. si null l'adresse est invalide


    ex: pour un id_egst_adr='2601627' j'ai dans ma table adresse deux lignes car cette personne a déménagé (donc elle à eu deux adresses)

    id_adr lb_rue_adr
    747368 PIERRE DUPONT (dernière adresse du dossier)
    735482 (null) ( première adresse du dossier : invalide)



    avec ma requête je remonte l'enregistrement
    735482 (null)

    il faudrait que cette requête de retourne rien vu que le max(id_adr) est 747369 et que lb_rue_adr n'est pas null

    je suis sur que c'est un truc tout bête, mais j'y arrive pas

    Merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 150
    Points : 1 935
    Points
    1 935
    Par défaut
    Bonjour,

    Il faut que tu utilises la version max avec la clause KEEP, et que tu déplaces la condition "lb_rue_adr is null" dans la clause HAVING.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select max(id_adr),id_egst_adr 
    from adr 
    where id_egst_adr='2601627'
    group by id_egst_adr
    having max(lb_rue_adr) keep (dense_rank last order by id_adr) is null;

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il vous faut une date pour être capable de définir la dernière valeur, se baser sur l'id le plus grand c'est un bogue dans votre solution.
    Sinon quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select id_egst_adr, max(id_adr)
        from adr
       where id_egst_adr = '2601627'
    group by id_egst_adr
      having max(lb_rue_adr) keep(dense_rank first order by id_adr desc) is null;

  4. #4
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    un grand merci .

    J'aurai bien voulu utiliser une date mais ma table adresse est très mal faite (à mon sens) car j'ai pas de date.
    Je ne connaissais pas "keep (dense_rank last order by id_adr) is null"

    en tout car un grand merci pour vos réponses, j'ai bien la liste des tous mes dossiers invalides

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 299
    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 299
    Points : 39 639
    Points
    39 639
    Billets dans le blog
    9
    Par défaut
    Comme indiqué par Waldar, il ne faut jamais utiliser une valeur d'un identifiant attribué par le SGBD pour en déduire un ordre d'arrivée.
    Cette erreur grossière est la source de bien des déconvenues.

    Plusieurs façons de trouver l'élément le plus récent, le plus ancien, le plus petit ou le plus grand sont expliquées dans mon blog ICI

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select id_egst_adr, id_adr
      from adr
           match_recognize(partition by id_egst_adr
                               order by id_adr
                               measures id_adr as id_adr
                                one row per match 
                                pattern ( x $ ) 
                                 define x as lb_rue_adr is null
                          );

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

Discussions similaires

  1. [XL-2013] Trouver la valeur max avec conditions
    Par monfiston dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 09/02/2020, 18h13
  2. [XL-2010] recherche d'une valeur max sur une cellule sous une condition
    Par GO GHO dans le forum Excel
    Réponses: 3
    Dernier message: 31/07/2015, 16h57
  3. Valeur MAX avec plusieurs condition
    Par Beaudelicius dans le forum Excel
    Réponses: 2
    Dernier message: 18/10/2013, 18h36
  4. if avec une condition mais 2 valeurs possibles
    Par chrisaccess dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2011, 19h01
  5. [XSLT]Trouver un noeud avec une condition sur ses sous-noeuds
    Par enguerran dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/02/2007, 11h00

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