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 de la transactions la plus récente


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 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut SELECT de la transactions la plus récente
    Bonjour!

    J'ai un petit soucis, je dois pouvoir sélectionner les dernières transactions basés sur une clef dans une DB pour pouvoir faire un petit reporting.

    Mon problème ici, c'est que je n'arrive pas à ne sélectionner que la dernière date à chaque fois et je me retrouve avec des dizaines (centaines) de résultats pour chaque clef...

    La DB est assez mal foutue de sorte que la PK se trouve dans une table mais n'est pas référencée dans la seconde. Je dois donc me baser sur le trans_num (numero de transaction) et/ou le terminal ID...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT tc.PK, max(td.date_time_stamp) AS "Last record", td.record1, td.rerecord2 
     
    FROM table1 tc, table2 td
     
    WHERE tc.trans_num = td.trans_num 
     AND tc.terminal_id = td.terminal_id 
     AND tc.trans_type = 8 
     AND tc.PK IN ( 'XXXXXXXX','XXXXXXXX')
     
    GROUP BY tc.PK, td.record1, td.rerecord2
    Malheureusement, le max de cette query ne fonctionne pas et je commence à patauger. Toute aide serait donc fortement appréciable pour ceci!

    D'avance, un grand merci et une bonne journée à vous!
    gora

  2. #2
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Bonjour,

    A affiner, mais tu devais t'en sortir avec quelque chose comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT tc.PK, td.date_time_stamp AS "Last record", td.record1, td.rerecord2 
    rank() over(partition by tc.PK order by td.date_time_stamp desc) rangFROM table1 tc, table2 td
    WHERE tc.trans_num = td.trans_num 
    AND tc.terminal_id = td.terminal_id 
    AND tc.trans_type = 8 
    AND tc.PK IN ( 'XXXXXXXX','XXXXXXXX')
    AND rang = 1

  3. #3
    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
    On ne peut pas utiliser une fonction analytique et la filtrer directement, il faut impérativement passer par une sous-requête.

    Il y a plusieurs méthodes pour résoudre votre problème. Celle qui consiste à classer les données puis à filtrer sur la plus récente (solution de LBO72).

    Vous pouvez le faire sans sous-requête en utilisant les fonctions d'agrégat FIRST / LAST. Attention cette méthode ne renvoie qu'une ligne par PK, si vous avez deux dates identiques ce n'est pas la meilleure méthode.

    Vous pouvez le faire à l'ancienne, calculer le max de la date par PK puis faire la jointure sur ces deux colonnes.

    Ou en une seule requête en jouant des concaténations et sous-chaînes.
    Je vous mets la requête car je trouve cette méthode astucieuse, mais attention aux types de record1 et record2, surtout si ce sont des nombres :
    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
    select
        tc.pk,
        max(td.date_time_stamp) as "Last record",
        substr(max(to_char(td.date_time_stamp, 'yyyymmddhh24miss') || td.record1), 14) as record1,
        substr(max(to_char(td.date_time_stamp, 'yyyymmddhh24miss') || td.record2), 14) as record2
    from
        table1 tc
        inner join table2 td
          on td.trans_num   = tc.trans_num 
         and td.terminal_id = tc.terminal_id 
    where 
        tc.trans_type = 8 
    and tc.pk in ('XXXXXXXX','XXXXXXXX')
    group by
        tc.pk

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut
    Bonjour,

    La requête telle qu'elle ne fonctionnait pas mais une petite recherche sur google m'a permis de trouver un moyen de ne prendre que les rang 1.

    Un très grand merci pour m'avoir aiguillé vers la solution!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * FROM
    (
    SELECT tc.PK, td.date_time_stamp AS "Last record", td.record,
    	   Rank() over(Partition by tc.PK order by td.date_time_stamp desc) as Rank
     
    FROM table1 tc, table2 td
     
    WHERE tc.trans_num = td.trans_num 
     AND tc.terminal_id = td.terminal_id 
     AND tc.PK IN ( 'XXXXXX','XXXXXX',)
    ) tmp
    WHERE Rank = 1
    Bonne journée!
    gora

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

Discussions similaires

  1. Selection avec date la plus récente
    Par chmdev dans le forum Langage SQL
    Réponses: 17
    Dernier message: 07/10/2010, 10h46
  2. Selection le fichier le plus récent
    Par miketidy dans le forum Linux
    Réponses: 3
    Dernier message: 10/09/2008, 14h04
  3. Réponses: 6
    Dernier message: 19/05/2008, 17h55
  4. Select la date la plus récente
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2005, 16h45
  5. [Tomcat] migration vers une version plus récente
    Par butcher dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 31/10/2003, 21h46

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