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 :

Un max qui renvoit null


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Par défaut Un max qui renvoit null
    Bonjour,

    J'ai une requette qui fonctionne mais que je cherche à optimiser.

    J'ai une table avec un id et une date pour chaque id non unique je peux avoir plusieurs date dont une eventuellement null

    par exple :

    id date
    1 12/01/2009
    1 08/09/2008
    1 07/08/2008
    2 12/04/2009
    2
    2 12/01/2009

    lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(date) from table group by id
    j'obtiens toujours une date seulement je voudrais retourner null pour l'id 2

    j'ai une solution hypra tordu mais je me dis qu'il y a plus simple c'est pour ca que je pose pas mon code, ca evite d'etre influencer dans une mauvaise voie.


    Merci de votre aide
    si je ne suis pas assez clair n'hesiter pas a me le dire.

    Si il faut je posterai ma solution

    Cordialement,

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    with test as
    (
    select 1 as id, to_date('12/01/2009', 'dd/mm/yyyy') as tdate from dual union all
    select 1, to_date('08/09/2008', 'dd/mm/yyyy') from dual union all
    select 1, to_date('07/08/2008', 'dd/mm/yyyy') from dual union all
    select 2, to_date('12/04/2009', 'dd/mm/yyyy') from dual union all
    select 2, null                                from dual union all
    select 2, to_date('12/01/2009', 'dd/mm/yyyy') from dual
    )
      SELECT id,
             nullif(max(nvl(tdate, date '9999-12-31')), date '9999-12-31') tdate_max
        FROM test
    GROUP BY id
    ***************
    ID	TDATE_MAX
    1	12/01/2009
    2

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Par défaut
    Merci Waldar,
    J'avais en fait la meme solution, mais j'utilisais un decode au lieu du nullif, ce qui facilite la lecture du code.
    Par contre point de vue performance ca reste identique. mais j'ai vu que que le max seul me donne le meme cout à l'explain plan. Donc pas d'optimiation possible.
    Merci pour l'aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Juste pour information, nullif est rentré dans la norme SQL.
    Mais comme vous j'utilise plus facilement un case when qui est plus facile en relecture.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je ne suis pas un fan du codage en dur de la valeur bidon date '9999-12-31' car si un jour un développeur a la même idée alors la valeur '9999-12-31' sera remplacée par null...

    je préferais quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(d) keep (dense_rank last order by d)
    mais bon, c'est sans doute moins performant

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Très bien vu, je n'y avais pas pensé (ce qui est malheureux avec la dernière entrée sur mon blog qui vante le mérite de ces fonctions).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH test AS
    (
    SELECT 1 AS id, to_date('12/01/2009', 'dd/mm/yyyy') AS tdate FROM dual union ALL
    SELECT 1, to_date('08/09/2008', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 1, to_date('07/08/2008', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 2, to_date('12/04/2009', 'dd/mm/yyyy') FROM dual union ALL
    SELECT 2, NULL                                FROM dual union ALL
    SELECT 2, to_date('12/01/2009', 'dd/mm/yyyy') FROM dual
    )
      SELECT DISTINCT
             id,
             max(tdate) keep (dense_rank last order by tdate asc nulls last) over(partition by id) tdate_max
        FROM test        
    ORDER BY id asc
    Sur une volumétrie de 6M de lignes, le group by a répondu en 11 secondes, le distinct + keep a répondu en 20 secondes.

    C'est moins bon, mais sur des petites volumétries ça devrait passer relativement inaperçu.

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

Discussions similaires

  1. JtextField qui renvoit la valeur <null> dans la BD
    Par elmander dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 23/02/2010, 13h23
  2. Max() qui ne renvoit pas ce qu'il faudrait
    Par oceane751 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/09/2006, 23h07
  3. [SPL] Rewind() qui renvoie NULL
    Par fadeninev dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 06/06/2006, 15h44
  4. [SQL2K]Procédure stockée qui renvoit deux fois le résultat
    Par neuropathie dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/05/2006, 16h38
  5. [JDBC]Un new qui renvoie null...
    Par Ditch dans le forum JDBC
    Réponses: 4
    Dernier message: 03/01/2005, 13h14

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