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

Oracle Discussion :

SQL standard vers les fonctions analytiques


Sujet :

Oracle

  1. #1
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut SQL standard vers les fonctions analytiques
    Bonjour messieurs dames,

    Pourriez-vosu me donner la correspondance en fonction analytiques pour cette requete.

    Merci beaucoup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     select   h.date
       from     histo h
       where    h.id_objet = &id_objet
       and      h.no_ordre = (   select   min(no_ordre) from histo h2
                               where    h2.id_objet = h.id_objet
                               and      h2.code = 'DEBUT );
    J'avoue mon inculture à ce niveau

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Un premier élément de réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * from (
    	select  dateh, code, id_objet, 
            min(no_ordre) over (partition by id_objet order by no_ordre) as mno from (
    		select dateh, code, id_objet, no_ordre from histo
    		where code = 'DEBUT')
    ) where id_objet = 1;
    Je crois qu'il faut passer par une inline view pour filtrer sur code='DEBUT'.

    Voir aussi http://lalystar.developpez.com/fonctionsAnalytiques/

  3. #3
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    il me renvoie deux lignes

    Pourtant c'est simple je souhaite la date du plus petit numero d'ordre. Les fonctions analytiques ne répondent pas à ce besoin ?

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Essayez:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select * from (
            select  dateh, code, id_objet, 
            row_number() over (partition by id_objet order by no_ordre) as rn,
            min(no_ordre) over (partition by id_objet order by no_ordre) as mno         
            from (	select dateh, code, id_objet, no_ordre from histo
    		where code = 'DEBUT')
    ) where id_objet = 1 and rn = 1;

  5. #5
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Je viens juste de découvrir il y a quelque jour les fonctions analytiques et donc le problème m'interesse particulièrement.
    Je me demande si cela vaut vraiment le coup de les utiliser ici. D'après ce que j'ai compris, l'interet est de travailler sur des groupes de données (comme avec un group by), mais avec largement plus de possibilités et des meilleures performances.
    Mais dans le cas présent, sachant qu'on cherche le min de tout le jeu de donnée ramené, est ce que l'on va gagner en performances?
    D'autre part est ce qu'il faut utiliser le partition by, sachant qu'on recherche le min de toute la table?
    Merci d'avance de vos précisions.

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mais dans le cas présent, sachant qu'on cherche le min de tout le jeu de donnée ramené, est ce que l'on va gagner en performances?
    Ca dépend: il faudrait comparer l'exécution des 2 requêtes. Il est souvent plus intéressant d'utiliser une fonction analytique qu'une auto-jointure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    D'autre part est ce qu'il faut utiliser le partition by, sachant qu'on recherche le min de toute la table?
    Si on recherche le min sur toute une table, il n'est pas nécessaire d'utiliser la fonction analytique.

  7. #7
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Merci pour ces précisions pifor, décidément je trouve ces fonctions analytiques de plus en plus pratiques

  8. #8
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par pifor
    Essayez:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select * from (
            select  dateh, code, id_objet, 
            row_number() over (partition by id_objet order by no_ordre) as rn,
            min(no_ordre) over (partition by id_objet order by no_ordre) as mno         
            from (	select dateh, code, id_objet, no_ordre from histo
    		where code = 'DEBUT')
    ) where id_objet = 1 and rn = 1;
    Je regarde çà demain et je te tiens au courant. Par contre la requete à l'air plus lourde que la requete initiale. Lourde en terme de complexité et de nombre de caractères. Je regarderai le plan d'accès.

Discussions similaires

  1. [2012] Sql Enterprise désactivé les fonction Enterprise
    Par Donpi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/06/2013, 15h35
  2. Sql dynamique dans les fonctions
    Par mello dans le forum Requêtes
    Réponses: 21
    Dernier message: 11/07/2011, 11h20
  3. Réponses: 3
    Dernier message: 04/07/2008, 17h03
  4. [SQL] [Oracle 9.2] fonctions analytiques grosses tables
    Par Hugues_78 dans le forum Oracle
    Réponses: 11
    Dernier message: 10/10/2006, 18h27
  5. [SQL] Nommer efficacement les fonctions, classes, etc.
    Par Metallic-84s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/09/2006, 18h57

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