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 :

Récupération enregistrement avec max(date)


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut Récupération enregistrement avec max(date)
    Bonjour,
    Je bloque sur une requête qui ne me semblait pas très compliqué.
    Je veux récupérer la ligne correspondant à mon max(date) et celui-ci peut-être dans ma table1 ou 2
    Table1
    Col1     Col2     Col3              
    1        az       23/01/2012    
    2        dt       24/01/2012    
    3        po       25/01/2012    
    4        ml       28/01/2012    
    
    Table2
    Col1     Col2     Col3              
    1        fg       24/01/2012    
    2        xb       21/01/2012    
    3        rf       26/01/2012    
    4        fg       30/01/2012    
    Je voudrai donc avoir:
    1        fg       24/01/2012    
    2        dt       24/01/2012    
    3        rf       26/01/2012    
    4        fg       30/01/2012    
    J'imagine bien qu'il faut un group by et un max mais je n'arrive pas à le réaliser
    Cordialement

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Je ferai un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT Col2, MAX(Col3)
    FROM
    ( 
    SELECT Col1 Col2 Col3 FROM Table1
    UNION
    SELECT Col1 Col2 Col3 FROM Table2
    )
    GROUP BY Col2
    Bonne journée,

    Arkhena

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Oui mais non.
    Ma Col2 étant différente dans les 2 tables, si je fais group by dessus, je récupère les 2 lignes.
    Merci quand même

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Avec une fonction analytique
    Edit : Il aurait été bien de décrire les liens entre les tables (genre le regroupement se fait par col1, et je veux afficher les col2, col3 pour la ligne ayant la col3 max)

    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 Table1 AS (SELECT 1 col1, 'az' col2, TO_DATE('23/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 2 col1, 'dt' col2, TO_DATE('24/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 3 col1, 'po' col2, TO_DATE('25/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 4 col1, 'ml' col2, TO_DATE('28/01/2012', 'DD/MM/YYYY') col3 FROM dual),
    Table2 AS (SELECT 1 col1, 'fg' col2, TO_DATE('24/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 2 col1, 'xb' col2, TO_DATE('21/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 2 col1, 'aa' col2, TO_DATE('21/04/2011', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 3 col1, 'rf' col2, TO_DATE('26/01/2012', 'DD/MM/YYYY') col3 FROM dual
    UNION ALL SELECT 4 col1, 'fg' col2, TO_DATE('30/01/2012', 'DD/MM/YYYY') col3 FROM dual)
    SELECT col1, 
    	MIN(col2) KEEP (DENSE_RANK FIRST ORDER BY col3 desc) AS col2,
    	MIN(col3) KEEP (DENSE_RANK FIRST ORDER BY col3 desc) AS col3
    FROM (SELECT col1, col2, col3 FROM table1 
    UNION ALL
    SELECT col1, col2, col3 FROM table2
     )
     GROUP BY col1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    COL1	COL2	COL3
    1	fg	24/01/2012
    2	dt	24/01/2012
    3	rf	26/01/2012
    4	fg	30/01/2012

  5. #5
    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 394
    Points
    18 394
    Par défaut
    Pas tout-à-fait Arkhena.

    Pinocchio, que faut-il retourner dans ce cas de figure :
    Table1
    5   aa   01/01/2012
    
    Table2
    5   bb   01/01/2012

  6. #6
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Effectivement j'avais lu trop vite. Par contre, je ne comprends pas bien comment on choisit quelle Col2 à afficher...

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    La col2 de la table de la ligne où le col3 est le max.

  8. #8
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Désolé pour le retard de réponse, j'étais parti sur autre chose en urgence.
    C'est le max de la col3.
    Je n'ai pas de cas où la date est la même. Il y a les heures minutes secondes et la donnée dans la table 2 provient de la table 1 via une première action d'une personne. Pour avoir le même état dans les 2 tables (c'est une autre colonne dont je me sers dans le where), il faut une autre opération opérateur.
    Donc pas de souci.

    Je vais étudier la solution de MCM car je ne connais pas les fonctions analytiques.

    Je reviendrai vers vous pour dire ce qu'il en est.

    Merci

  9. #9
    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 394
    Points
    18 394
    Par défaut
    En fait ce n'est pas une fonction analytique mais une fonction d'agrégat.
    La syntaxe KEEP dense_rank m'a aussi souvent induit en erreur, mais les fonctions sont FIRST / LAST, et attention elles existent aussi dans la version analytique.
    Plus d'info chez Oracle.

    Sinon, on peut simplifier légèrement la requête de McM :
    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
    18
    19
    With SR as
    ( 
    SELECT Col1, Col2, Col3 FROM Table1
     UNION ALL
    SELECT Col1, Col2, Col3 FROM Table2
    )
      SELECT Col1
           , MAX(Col2) keep (dense_rank first order by Col3 desc) as Col2
           , MAX(Col3)                                            as Col3
        FROM SR
    GROUP BY Col1
    ORDER BY Col1 ASC;
     
    COL1 COL2 COL3     
    ---- ---- ----------
       1 fg   24/01/2012 
       2 dt   24/01/2012 
       3 rf   26/01/2012 
       4 fg   30/01/2012

  10. #10
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Merci beaucoup pour cette aide, je me suisinspiré de vos requêtes pour avancer et j'obtiens le résultat souhaité.
    Merci

    Par contre, je pense ne pas avoir optimisé ma requête car j'ai pleins d'autres colonne dont une me pose problème.
    Cette col4 contient 0 ou 1

    Nous avons donc:
    Table1
    Col1 Col2 Col3 Col4
    1 az 23/01/2012 0
    2 dt 24/01/2012 1
    3 po 25/01/2012 1
    4 ml 28/01/2012 1

    Table2
    Col1 Col2 Col3 Col4
    1 fg 24/01/2012 1
    2 xb 21/01/2012 1
    3 rf 26/01/2012 0
    4 fg 30/01/2012 1
    Je récupère comme auparavant et j'obtiens :
    1 fg 24/01/2012 1
    2 dt 24/01/2012 1
    3 rf 26/01/2012 0
    4 fg 30/01/2012 1
    Seulement je ne veux que les enregistrements avec 1 mais bien avec la plus récente.
    La ligne 3 ne doit pas apparaître.
    Mon souci est qu'actuellement que je passe par un where ou un having, si j'effectue une sélection en retirant les col4 à 1, je récupère toujours ma 3ème ligne mais provenant de la mauvaise table.
    La seule solution que je trouve actuelleemnt correspond à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT Col1, Col2, Col3, Col4
    FROM
    (    SELECT Col1
           , MAX(Col2) keep (dense_rank first ORDER BY Col3 DESC) AS Col2
           , MAX(Col3)                                            AS Col3
           , MAX(Col4) keep (dense_rank first ORDER BY Col3 DESC) AS Col4
        FROM SR
        GROUP BY Col1
    ) t
    where t.Col4=1
    Ainsi j'obtiens bien:
    1 fg 24/01/2012 1
    2 dt 24/01/2012 1
    4 fg 30/01/2012 1
    Cette sous-requête est-elle bien la méthode adaptée?
    Sachant que je joue sur quelques millions d'enregistrements, cela prend beaucoup de temps et malheureusement, je n'ai pas trouvé d'autres solutions.

    Merci encore pour m'avoir permis d'arriver jusque là déjà.

  11. #11
    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 394
    Points
    18 394
    Par défaut
    Oui c'est correct !

  12. #12
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    ok merci

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

Discussions similaires

  1. récupération avec MAX(Date)
    Par Elise0251 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/10/2010, 01h24
  2. problème avec MAX(Date)
    Par ouchemhou dans le forum Langage SQL
    Réponses: 12
    Dernier message: 23/08/2008, 18h13
  3. Requête avec max date et champs correspondants
    Par sl1980 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2007, 01h01
  4. Select Avec Max(date)
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/08/2006, 18h26
  5. Requêtes sur enregistrements avec critères dates
    Par Aliveli dans le forum Access
    Réponses: 10
    Dernier message: 05/06/2006, 14h41

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