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 :

recherche personnalisée par date ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club Avatar de mohe27
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 55
    Points
    55
    Par défaut recherche personnalisée par date ?
    Bonjour les amis,
    Je possède une table comprenant des informations brutes dont certaines se répètent, en fait il s’agit d’une table qui englobe l’historique de données qui ont défilées par rapport à une information bien précise (le numéro Tel), je m’explique :
    Ci-dessous la table table_historique que je viens de citer :

    | |Nom| |Tel| |Adresse| |Date_maj|
    1| Alain| 0633100000| paris| 01/02/2011
    2| Alain| 0633100000| marseille| 02/02/2011
    3| Marc| 0633100010| paris| 10/02/2011
    4| Jully| 0633100010| paris| 15/02/2011
    5| Brad| 0633100000| lyon| 20/02/2011
    6| Michel| 0633100010| madrid| 25/02/2011

    Comme vous pouvez le constater dans cet exemple, il y a 2 nuemro de Tel qui ont changé de main suivant des dates de Mise à jour (Date_maj) bien définies, en réalité cet exemple doit permettre de suivre l’allocation de tel ou tel numéro de Tel et à quelle personne il a appartenu et à quelle date.
    Ma question est la suivante :

    Depuis une requête Sql, comment peut-on agir si on voulait faire ressortir par exemple la dernière mise à jour ayant été introduite sur la table suivant une date bien précise ?

    Exemple :
    - les dernières informations ayant été introduites jusqu’au 11/02/2011 fera ressortir les lignes 2 et 3
    - les dernières informations ayant été introduites jusqu’au 18/02/2011 fera ressortir les lignes 2 et 4
    - les dernières informations ayant été introduites jusqu’au 22/02/2011 fera ressortir les lignes 4 et 5
    - les dernières informations ayant été introduites jusqu’au 26/02/2011 fera ressortir les lignes 5 et 6

    Voilà j’espère que c’est assez clair.
    Je vous remercie pour votre aide si précieuse

    Merci les amis

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select A0.*
    from ma_table as A0
    join (
    	select tel, max(numero) as max_numero
    	from ma_table
    	where date_maj <= @Date_parametre
    	group by tel
    ) as SR
    	on SR.max_numero = A0.numero
    		and SR.tel = A0.tel
    Je pars du principe que les numéros suivent l'ordre chronologique de saisie des informations.
    Dernière modification par Invité ; 28/02/2011 à 16h48.

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    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
    23
    24
    25
    26
    27
    28
    29
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With Data As (
      2    Select 1 As Num, 'Alain' As Nom, '0633100000' As Tel, 'paris' As Adresse, '01/02/2011' As Dat_maj from dual union all
      3    Select 2, 'Alain', '0633100000', 'marseille', '02/02/2011' from dual union all
      4    Select 3, 'Marc', '0633100010', 'paris', '10/02/2011' from dual union all
      5    Select 4, 'Jully', '0633100010', 'paris', '15/02/2011' from dual union all
      6    Select 5, 'Brad', '0633100000', 'lyon', '20/02/2011' from dual union all
      7    Select 6, 'Michel', '0633100010', 'madrid', '25/02/2011' from dual
      8  )
      9  Select Max(Num) Keep (Dense_Rank Last Order By Dat_Maj) As Num,
     10         Max(Nom) Keep (Dense_Rank Last Order By Dat_Maj) As Nom,
     11         Tel,
     12         Max(Adresse) Keep (Dense_Rank Last Order By Dat_Maj) As Adresse,
     13         Max(Dat_Maj)  Keep (Dense_Rank Last Order By Dat_Maj) As Dat_Maj
     14    From data
     15   Where dat_maj < &p_dat
     16   Group By Tel
     17  /
     
           NUM NOM    TEL        ADRESSE   DAT_MAJ
    ---------- ------ ---------- --------- ----------
             5 Brad   0633100000 lyon      20/02/2011
             6 Michel 0633100010 madrid    25/02/2011
     
    SQL>

  4. #4
    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 387
    Points
    18 387
    Par défaut
    Une petite simplification par rapport au code de mnitu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -- Max(Dat_Maj) Keep (Dense_Rank Last ORDER BY Dat_Maj) AS Dat_Maj
       max(Dat_maj)                                         AS Dat_Maj

  5. #5
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Petite question,

    J'aurais utilisé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    First_Value(Num) Over(Partition by Tel ORDER BY Dat_Maj DESC) AS Num,
    au lieu de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Max(Num) Keep (Dense_Rank Last ORDER BY Dat_Maj) AS Num,

    Il y a t il une différence fondamentale entre les deux syntaxes ? Une préférable à l'autre ?

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Dans votre exemple:

    1) C'est une fonction analytique ou de fenêtrage
    2) C’est une fonction d’agrégation

    Testez les deux et vous allez mieux comprendre les différences.

  7. #7
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Je ne peux hélas pas tester n'ayant pas accès à une BDD actuellement.

    Cependant, je viens de saisir la petite subtilité qui m'échappait et je me rend compte que j'utilisais les first_value en tant que fonction d'aggrégat m'obligeant ainsi à ajouter un DISTINCT pas idéal niveau perf.

    C'était plus par défaut qu'autre chose vu que je ne connaissais pas la syntaxe avec KEEP.

    Merci à vous.

  8. #8
    Membre du Club Avatar de mohe27
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 55
    Points
    55
    Par défaut
    Merci les amis,

    pour ma part la réponse de mnitu m'a beaucoup aidé

    merci encore

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

Discussions similaires

  1. Recherche dynamique par date
    Par antonag dans le forum Développement
    Réponses: 2
    Dernier message: 23/07/2012, 10h47
  2. [MySQL] Recherche avancée par date
    Par Evengeline dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 05/07/2011, 13h53
  3. rechercher email par date php imap
    Par diabli73 dans le forum Langage
    Réponses: 16
    Dernier message: 09/02/2009, 18h47
  4. recherche par date vba excel
    Par fred014 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/03/2007, 13h35
  5. Moteur de recherche par date
    Par Prue dans le forum ASP
    Réponses: 17
    Dernier message: 27/08/2003, 16h07

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