Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 15h54   #1
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 96
Points : 13
Points : 13
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
mohe27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h09   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Code :
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.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 17h05   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Code :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 18h44   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Une petite simplification par rapport au code de mnitu :
Code :
1
2
-- Max(Dat_Maj) Keep (Dense_Rank Last ORDER BY Dat_Maj) AS Dat_Maj
   max(Dat_maj)                                         AS Dat_Maj
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h18   #5
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Petite question,

J'aurais utilisé ceci :

Code :
First_Value(Num) Over(Partition BY Tel ORDER BY Dat_Maj DESC) AS Num,
au lieu de ceci :

Code :
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 ?
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 11h43   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 14h16   #7
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
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.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 14h05   #8
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 96
Points : 13
Points : 13
Merci les amis,

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

merci encore
mohe27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web