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 :

Requêtes analytiques


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2012
    Messages : 52
    Par défaut Requêtes analytiques
    Bonjour,

    je veux savoir quelle est la différence entre une fonction d'agrégation normale et une fonction d’agrégation analytique.

    par exemple dans une requête sql:
    select max(date) over(partition by ..) fonctionne
    et select max(date) ne fonctionne pas.
    dans quel cas les fonctions d'agrégations normales ne fonctionnent plus ?

    Merci d'avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Que signifie fonctionne ou ne fonctionne pas ?
    Le résultat n'est pas bon ?
    La requête ne s'exécute pas et tu as un message d'erreur ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Pour comprendre une fonctionnalité le mieux c'est de se faire un jeu de test simple (mais attention au jeu de test simpliste...)

    Les principales différences entre une fonction analytique et une fonction de regroupement sont :
    • Une fonction analytique ne nécessite pas d'utiliser GROUP BY
      Chaque ligne retournée est présente.
      Il est généralement nécessaire (en fonction de la fonction utilisée) de spécifier la clause ORDER BY
      Toutes les fonctions d'aggrégations sont également analytiques (y compris les user defined aggregate) mais il en existe d'autres
    • Une fonction de regroupement réduit le nombre de lignes aux valeurs distinctes des colonnes non aggrégées.
      Les fonctions de regroupement impliquent qu'il est nécessaire de spécifier toutes les colonnes non aggrégées dans la clause GROUP BY.


    Ci dessous un exemple avec max où le WITH correspond à une simulation d'une table t, la requête commence après la ) :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    SQL> with t as (
    select 1 as c1, 1 as c2 from dual union all
    select 1 as c1, 3 as c2 from dual union all
    select 2 as c1, 1 as c2 from dual union all
    select 2 as c1, 2 as c2 from dual
    )
    select c1,
           max(c2) over(partition by c1) as max_c2
      from t
    /
     
            C1     MAX_C2
    ---------- ----------
             1          3
             1          3
             2          2
             2          2
     
    SQL> 
    SQL> 
    SQL> with t as (
    select 1 as c1, 1 as c2 from dual union all
    select 1 as c1, 3 as c2 from dual union all
    select 2 as c1, 1 as c2 from dual union all
    select 2 as c1, 2 as c2 from dual
    )
    select c1, max(c2) as max_c2
      from t
     group by c1
    /
     
            C1     MAX_C2
    ---------- ----------
             1          3
             2          2
     
    SQL>
    Je te recommande la lecture de :
    Les fonctions analytiques

  4. #4
    Membre actif
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2012
    Messages : 52
    Par défaut
    @skuatamad: merci beuacoup,maintenant j'arrive à faire un petit peu la différence
    @al1_24 : ça ne fonctionne pas c'est à dire que la requête ne me rend pas les résultats que je veux parfois ça m'affiche un message d'erreur parfois m'affiche le résultat mais pas celui que je souhaite avoir.

    Merci pour le temps que vous m'avez donné pour me répondre

  5. #5
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Est-il possible d'avoir les requêtes entières et un exemple concret de données nous montrant l'erreur ?

    Et quel est le message d'erreur qui s'affiche ?

  6. #6
    Membre actif
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2012
    Messages : 52
    Par défaut
    ma requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(histo.his_date)
    le message d'erreur est :
    Exception: DBD, [Microsoft][ODBC driver for Oracle][Oracle]ORA-00937: la fonction de groupe ne porte pas sur un groupe simpleState: NA000
    lorsque j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(histo.his_date) over (partition by matricule)
    ça ne me donne pas l'erreur et ça fonctionne.

Discussions similaires

  1. Requêtes analytiques dans BO
    Par le_om dans le forum Designer
    Réponses: 2
    Dernier message: 12/03/2012, 13h08
  2. Réponses: 12
    Dernier message: 09/11/2009, 15h45
  3. Aide sur Requête analytique
    Par jerjerrod dans le forum SQL
    Réponses: 5
    Dernier message: 02/10/2008, 22h01
  4. Afficher ligne à 0 dans requête analytique
    Par jerjerrod dans le forum SQL
    Réponses: 4
    Dernier message: 29/05/2008, 23h12
  5. Besoin d'aide sur une requête analytique
    Par PoichOU dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/11/2007, 10h40

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