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 :

Select sur un max date, compliqué..


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut Select sur un max date, compliqué..
    Bonjour à tous,

    j'ai une table de log dans laquelle je stock toutes les actions d'une journée, par exemple je peux logger l'envoie d'une information, mais cette information peut avoir été envoyée une première fois en KO et une seconde fois en OK.

    Donc en gros un truc du genre :

    DATETIME ID_INFO STATUT
    02/11/2009 8:53:00 1 KO
    02/11/2009 9:18:15 1 OK

    J'ai environs 100 000 informations différentes qui transitent.

    Ma question est : comment je peux obtenir la liste de mes infos avec le dernier statut connu sur la journée ?

    Je pense à une fonction analytique, mais je vois pas comment l'utiliser...

    Merci pour votre aide !

  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
    Avec KEEP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with MaTable AS
    (
    select to_date('02/11/2009 08:53:00', 'dd/mm/yyyy hh24:mi:ss') as DATETIME, 1 as ID_INFO, 'KO' as STATUT from dual union all
    select to_date('02/11/2009 09:18:15', 'dd/mm/yyyy hh24:mi:ss')            , 1           , 'OK'           from dual
    )
      select max(datetime) as datetime,
             max(id_info) keep (dense_rank first order by datetime desc) as id_info,
             max(statut)  keep (dense_rank first order by datetime desc) as statut
        from MaTable
    group by id_info;
     
    DATETIME		ID_INFO	STATUT
    02/11/2009 09:18:15	1	OK

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par shadeoner Voir le message
    ...
    Je pense à une fonction analytique, mais je vois pas comment l'utiliser...

    Merci pour votre aide !
    La solution analytique est recommandée pour le cas où vous voulez avoir le détail et l’agrégation

    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
    20
    21
    22
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0 
    Connected as mni
     
    SQL> 
    SQL> WITH MaTable AS
      2  (
      3  SELECT to_date('02/11/2009 08:53:00', 'dd/mm/yyyy hh24:mi:ss') AS DATETIME, 1 AS ID_INFO, 'KO' AS STATUT FROM dual union ALL
      4  SELECT to_date('02/11/2009 09:18:15', 'dd/mm/yyyy hh24:mi:ss')            , 1           , 'OK'           FROM dual
      5  )
      6    SELECT id_info, datetime, statut,
      7           last_value(statut) over(partition by id_info order by datetime
      8                     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
      9      FROM MaTable
     10  /
     
       ID_INFO DATETIME    STATUT LAST_VALUE(STATUT)OVER(PARTITI
    ---------- ----------- ------ ------------------------------
             1 02/11/2009  KO     OK
             1 02/11/2009  OK     OK
     
    SQL>

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par mnitu Voir le message
    La solution analytique est recommandée pour le cas où vous voulez avoir le détail et l’agrégation

    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
    20
    21
    22
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0 
    Connected as mni
     
    SQL> 
    SQL> WITH MaTable AS
      2  (
      3  SELECT to_date('02/11/2009 08:53:00', 'dd/mm/yyyy hh24:mi:ss') AS DATETIME, 1 AS ID_INFO, 'KO' AS STATUT FROM dual union ALL
      4  SELECT to_date('02/11/2009 09:18:15', 'dd/mm/yyyy hh24:mi:ss')            , 1           , 'OK'           FROM dual
      5  )
      6    SELECT id_info, datetime, statut,
      7           last_value(statut) over(partition by id_info order by datetime
      8                     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
      9      FROM MaTable
     10  /
     
       ID_INFO DATETIME    STATUT LAST_VALUE(STATUT)OVER(PARTITI
    ---------- ----------- ------ ------------------------------
             1 02/11/2009  KO     OK
             1 02/11/2009  OK     OK
     
    SQL>
    Merci à tous, tu me dis que 'la fonction analytique est recommandée..." mais quelle autre solution est possible ?

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par shadeoner Voir le message
    Merci à tous, tu me dis que 'la fonction analytique est recommandée..." mais quelle autre solution est possible ?
    Je dis que dans ton cas la solution est celle fourni par Waldar et non pas une fonction analytique.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Je dis que dans ton cas la solution est celle fourni par Waldar et non pas une fonction analytique.
    Ok , merci, j'ai donc fais cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT
    id_annonce,
    max(id_agence),
    max(blg_status)  keep (dense_rank first ORDER BY blg_date DESC) AS blg_status
     FROM ANNONCE AN, T_BUNDLELOG_BLG BLG
    WHERE BLG.blg_lst_value = AN.id_annonce AND trunc(blg_date) = to_date('271009', 'ddmmyy')
      GROUP BY id_annonce
    J'ai 20 000 lignes sur cette date, et la requête tourne depuis 10mn.... ai-je omis quelque chose ?

    PS : ma requête est fausse... pourquoi ?


    PS2 : OK j'ai trouvé !!! MERci à tous !!

  7. #7
    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 celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
        max(an.id_annonce)  keep (dense_rank first ORDER BY blg.blg_date DESC) AS id_annonce,
        max(an.id_agence)   keep (dense_rank first ORDER BY blg.blg_date DESC) AS id_agence,
        max(blg.blg_status) keep (dense_rank first ORDER BY blg.blg_date DESC) AS blg_status
    FROM
        annonce an
        INNER JOIN t_bundlelog_blg blg
          ON blg.blg_lst_value = an.id_annonce
    WHERE 
        trunc(blg.blg_date) = to_date('27102009', 'ddmmyyyy')
    GROUP BY
        an.id_annonce;

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

Discussions similaires

  1. [Drupal] Sélection sur un champ date
    Par ngpub dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 31/03/2010, 09h46
  2. Réponses: 4
    Dernier message: 20/02/2010, 02h40
  3. Select avec "having max" sur chp date
    Par Adel_mana dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/08/2009, 12h01
  4. Select sum(Poids) sur max(date) group by adr
    Par olibara dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/04/2009, 18h12
  5. select sur la dernière date
    Par Oraman dans le forum Oracle
    Réponses: 21
    Dernier message: 09/11/2006, 15h23

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