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 :

[Debutant] [9iR2] Filtrage sur 2 dates


Sujet :

SQL Oracle

  1. #1
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut [Debutant] [9iR2] Filtrage sur 2 dates
    Bonjour,

    c'est ptet parce que c'est lundi, mais j'ai une requete que je n'arrive pas du tout à faire. Pourtant c'est un problème très commun je pense ...

    En fait, j'ai deux colonnes de type date dans mes lignes de résultats. Je voudrais filtrer les lignes qui ont les 2 dates les plus récentes.

    Par exemple, pour les données suivantes (en pièce jointe), je ne veux garder que la ligne marquée d'un point rouge:



    En clair, la ligne qui a le couple de date les plus récentes.

    J'ai esasyé de jouer avec des max, de convertir les dates en nombre et de faire la somme ... mais bon sans réel succès. Si vous avez une idée, voici ma requete ...


    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
     
    with pmb as (
    	   	SELECT orig_proj_id, add_date
    		FROM [...]
    	   ),  cur as (
    	   	SELECT orig_proj_id, add_date
    		FROM [...]
    	   ), proj as (
    	   	  	SELECT pw.proj_id id, wbs_short_name, wbs_name
    			FROM privuser.projwbs pw JOIN privuser.project p ON pw.proj_id = p.proj_id
    			WHERE proj_node_flag='Y' 
    			AND orig_proj_id IS NULL 
    			START WITH pw.wbs_short_name = 'P-01034' 
    			CONNECT BY PRIOR wbs_id = parent_wbs_id
    	   )
    	   	SELECT proj.id, proj.wbs_short_name, proj.wbs_name, pmb.wbs_id pmb, pmb.add_date pmbDate, cur.wbs_id cur, cur.add_date curDate
    		FROM proj LEFT JOIN pmb ON proj.id = pmb.orig_proj_id
    			 LEFT JOIN cur ON proj.id = cur.orig_proj_id
    PS : pour faire la "somme" des 2 dates, j'ai essayé de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nvl(to_number(to_char(pmb.add_date, 'RRRRMMDDHHMISS')),0) + nvl(to_number(to_char(cur.add_date, 'RRRRMMDDHHMISS')),0) sum_date
    . Je pense que c'est une partie de la solution mais je ne sais comment filtrer ensuite. Je pensais à greatest mais pas de réussite non plus
    Images attachées Images attachées  

  2. #2
    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
    Soit 2 sous-select
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    where pk = (select pk from matable 
    where rownum = 1 and (dt1, dt2) IN (select dte1, dte2
         FROM matable order by dte1 desc, dte2 desc)
    )

    Soit avec les fonctions analytiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT col1, FIRST_VALUE(dte1) OVER (PARTITION BY col1 ORDER BY dte1 DESC, dte2 DESC),
    FIRST_VALUE(dte2) OVER (PARTITION BY col1 ORDER BY dte1 DESC, dte2 DESC)

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Qu'entends-tu par couple de dates les plus récentes ?
    Ex
    Entre le couple
    (28/07/2007,31/07/2007)
    et le couple
    (29/07/2007,30/07/2007)
    Quel est le plus récent ?
    En clair () , merci d'expliciter un peu plus le besoin !

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par Garuda
    Entre le couple
    (28/07/2007,31/07/2007)
    et le couple
    (29/07/2007,30/07/2007)
    Bonne question !

    En fait les "tables temporaires" (je ne sais pas si c'est le bon terme) me renvoie des lignes avec 1 date.

    Je joins ensuite ces 2 tables à une troisième. J'aimerais que le résultat me donne la date la plus récente de chacune des tables temporaires.

    Je vais essayer d'être plus clair avec un exemple.

    contenu de pmb :

    orig_ID add_date idPMB
    --------------------------------
    1 01/01/2000 A
    1 01/01/2007 B
    2 01/01/1970 C
    2 01/01/2000 D

    contenu de cur :

    orig_ID add_date idCUR
    -------------------------------
    1 01/01/2000 E
    1 01/01/2007 F
    2 01/01/1970 G
    2 01/01/2000 H

    contenu de proj :

    ID
    ------
    1
    2

    J'aimerais trouver la requete qui me donne

    ID datePMB idPMB dateCUR idCUR
    --------------------------------------------------
    1 01/01/2007 B 01/01/2007 F
    2 01/01/2000 D 01/01/2000 H

    Voilà ...

    Je vais jeter un coup d'oeil du côté des first_value ...

  5. #5
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par McM
    Soit 2 sous-select
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    where pk = (select pk from matable 
    where rownum = 1 and (dt1, dt2) IN (select dte1, dte2
         FROM matable order by dte1 desc, dte2 desc)
    )
    Désolé mais là je comprends pas vraiment le truc ....

    Citation Envoyé par McM
    Soit avec les fonctions analytiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT col1, FIRST_VALUE(dte1) OVER (PARTITION BY col1 ORDER BY dte1 DESC, dte2 DESC),
    FIRST_VALUE(dte2) OVER (PARTITION BY col1 ORDER BY dte1 DESC, dte2 DESC)
    Alors, ça je découvre ... et je n'y arrive pas.

    J'ai essayé ça (pour la fin de ma requete) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT proj.id, proj.wbs_short_name, proj.wbs_name, pmb.wbs_id pmb
    			   , last_value(pmb.add_date) OVER (PARTITION BY proj.id ORDER BY pmb.add_date DESC) datePMB
    			   , cur.wbs_id cur
    			   , last_value(cur.add_date) OVER (PARTITION BY proj.id ORDER BY cur.add_date DESC) dateCUR
    		FROM proj LEFT JOIN pmb ON proj.id = pmb.orig_proj_id
    			 	  LEFT JOIN cur ON proj.id = cur.orig_proj_id
    mais bon c'est exactement pareil ...

    j'ai également essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY pmb.add_date 
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    dans la partie OVER, mais idem ...

    Bref, je me sens un peu perdu. Et à vrai dire je capte pas trop trop l'histoire des fonctions analytiques ...

  6. #6
    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
    Tu t'es trompé, c'est pas last mais first qu'il faut utiliser avec order by date desc
    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 proj AS (SELECT 1 AS ID, 'un' AS short_name FROM dual
    		UNION ALL SELECT 2, 'deux' FROM DUAL
    		UNION ALL SELECT 3, 'trois' FROM DUAL),
    pmb AS (SELECT 1 AS orig_proj_id, '01/01/2000' AS add_date, 'A' AS wbs_id FROM DUAL
    UNION ALL SELECT 1, '01/01/2007', 'B' FROM dual
    UNION ALL SELECT 2, '01/01/1970', 'C' FROM dual
    UNION ALL SELECT 2, '01/01/2000', 'D' FROM dual),
    cur AS (SELECT 1 AS orig_proj_id, '02/01/2000' AS add_date, 'E' AS wbs_id FROM DUAL
    UNION ALL SELECT 1, '02/01/2007', 'F' FROM dual
    UNION ALL SELECT 2, '02/01/1970', 'G' FROM dual
    UNION ALL SELECT 2, '02/01/2000', 'H' FROM dual)
    SELECT DISTINCT j.ID, j.short_name, 
    	first_value(p.wbs_id) 	OVER (PARTITION BY p.orig_proj_id ORDER BY p.add_date DESC) PMB,
    	first_value(p.add_date) 	OVER (PARTITION BY p.orig_proj_id ORDER BY p.add_date DESC) datePMB,
    	first_value(c.wbs_id) 	OVER (PARTITION BY c.orig_proj_id ORDER BY c.add_date DESC) CUR,
    	first_value(c.add_date)	OVER (PARTITION BY c.orig_proj_id ORDER BY c.add_date DESC) dateCUR
    FROM proj j, pmb p, cur c
    WHERE j.ID = p.orig_proj_id (+)
    AND j.ID = c.orig_proj_id (+)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID	SHORT_NAME	PMB	DATEPMB	CUR	DATECUR
    1	un	B	01/01/2007	F	02/01/2007
    2	deux	D	01/01/2000	H	02/01/2000
    3	trois

  7. #7
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Ha, je te remercie.

    J'avais mal compris le truc du over. En tous cas ça fonctionne

    Euh, juste une petite question bête de débutant : le distinct ne s'applique qu'à j.ID, j.short_name ? Ca me parait bizarre mais j'ai l'impression que c'est ça qui se passe ...

    En tout cas merci encore !

    A+

  8. #8
    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
    non, le distinct c'est sur tout.
    enlève le et tu verras que les lignes sont identiques par id.

  9. #9
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Je me demandais aussi, au niveau perf, quelle solution parmis les 2 proposées est généralement la meilleure ? 2 sous-select ou la fonction analytique ?

    enfin de manière générale, les fonctions analytiques sont elles performantes ?

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    oui, les fonctions analytiques sont meilleures parce qu'elle évite de ramener une collection de ligne plusieurs fois. La fonction est appliqué à l'ensemble des lignes ramenés par la requête soit sur une population de lignes bien moindre en général

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

Discussions similaires

  1. Debutant en JS cherche a faire une fonction sur les date
    Par teen6517 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 23/02/2011, 10h25
  2. [AC-2007] Filtrage sur date
    Par Looping972 dans le forum IHM
    Réponses: 12
    Dernier message: 09/11/2009, 11h15
  3. Réponses: 3
    Dernier message: 23/03/2009, 09h25
  4. debutant:imposer un format sur la date
    Par kam81 dans le forum Jasper
    Réponses: 1
    Dernier message: 30/11/2008, 18h10
  5. [Debutant(e)]operation sur dates
    Par sUrTr dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/10/2004, 15h58

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