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 :

[SQL / PL/SQL] fonction analytique last_value


Sujet :

SQL Oracle

  1. #1
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut [SQL / PL/SQL] fonction analytique last_value
    bonjour,

    je tente d'utiliser la fonction analytique last_value, mais je ne trouve pas le résultat voulu.
    voici le contenu de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NUMACCORD	ID	ID_EVT	DATE_EVT
    11954	             1	     1	        16/08/2007 16:27:00
    11954	             2	     2	        18/08/2007 04:16:00
    11954	             3	     18	        21/08/2007 17:25:00
    et je veux recuperer le dernier evenement, je lance donc cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select   numaccord,
             last_value(date_evt) over( partition by numaccord order by id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) debut,
             last_value(id_evt) over( partition by numaccord order by id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fin
    from     (select * from t where numaccord='11954')
    mais au lieu d'obtenir une seule ligne avec le dernier evenement, j'obtiens 3 lignes strictement identiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NUMACCORD	DATE_EVT	              ID_EVT
    11954	             21/08/2007 17:25:00	18
    11954	             21/08/2007 17:25:00	18
    11954	             21/08/2007 17:25:00	18
    et je ne comprends pas pourquoi, si quelqu'un pouvait m'eclairer sur ce point

    Merci

  2. #2
    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
    alors si j'ai bien compris la démo de Laurent ce devrait être :

    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
    create table t (NUMACCORD number, ID	number,ID_EVT	number, DATE_EVT date)
     
    insert into t values
    (11954,1,1,to_date('16/08/2007 16:27:00', 'DD/MM/YYYY HH24:MI:SS'))
     
    insert into t values
    (11954,2,2,to_date('18/08/2007 04:16:00', 'DD/MM/YYYY HH24:MI:SS'))
     
    insert into t values
    (11954,3,18,to_date('21/08/2007 17:25:00', 'DD/MM/YYYY HH24:MI:SS'))
     
    SQL> SELECT   numaccord, 
      2     MAX (ID)KEEP (DENSE_RANK LAST ORDER BY date_evt) id,
      3           MAX (id_evt)KEEP (DENSE_RANK LAST ORDER BY date_evt) id_evt
      4      FROM t
      5  GROUP BY numaccord
      6  ;

    NUMACCORD ID ID_EVT
    ---------- ---------- ----------
    11954 3 18

  3. #3
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    merci orafrance, mais si tu enleves le group by, tu as 3 lignes ou bien une seule ?

  4. #4
    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
    si t'enléve le group by tu as une erreur

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Nounoursonne Voir le message
    mais au lieu d'obtenir une seule ligne avec le dernier evenement, j'obtiens 3 lignes strictement identiques

    et je ne comprends pas pourquoi, si quelqu'un pouvait m'eclairer sur ce point
    Tout simplement parce que les fonctions analytiques ne sont pas des fonctions d'aggrégation. Elles te remontent sur chaque ligne le résultat de la fonction que tu as demandé. C'est ce qu'explique lalystar en introduction de son article.

  6. #6
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    ok, je n'avais pas fait attention à cette remarque.
    donc soit j'utilise la méthode d'Orafrane, soit j'ajoute rownum=1 à ma requete

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    ou encore un select distinct...

    le groupe by, de par son regroupement fait forcément un distinct implicite !

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par orafrance Voir le message
    alors si j'ai bien compris la démo de Laurent
    Excellent

    Mais attention aux doublons

    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
     
    insert into t values
    (11954,1000,-1000,to_date('21/08/2007 17:25:00', 'DD/MM/YYYY HH24:MI:SS'));
     
    SCOTT@LSC07> SELECT      numaccord,
      2    MAX (ID)KEEP (DENSE_RANK LAST ORDER BY date_evt) id,
      3      MAX (id_evt)KEEP (DENSE_RANK LAST ORDER BY date_evt) id_evt
      4        FROM t
      5          GROUP BY numaccord
      6            ;
     NUMACCORD         ID     ID_EVT
    ---------- ---------- ----------
         11954       1000         18
     
    SCOTT@LSC07> SELECT      numaccord,
      2    MAX (ID)KEEP (DENSE_RANK LAST ORDER BY date_evt,id) id,
      3      MAX (id_evt)KEEP (DENSE_RANK LAST ORDER BY date_evt,id) id_evt
      4        FROM t
      5          GROUP BY numaccord
      6            ;
     NUMACCORD         ID     ID_EVT
    ---------- ---------- ----------
         11954       1000      -1000

Discussions similaires

  1. [SQL / PL/SQL] fonction analytique last_value
    Par Nounoursonne dans le forum Oracle
    Réponses: 7
    Dernier message: 23/08/2007, 21h18
  2. Pb Fonction analytique last_value
    Par McM dans le forum SQL
    Réponses: 8
    Dernier message: 03/08/2007, 17h23
  3. [SQL] [Oracle 9.2] fonctions analytiques grosses tables
    Par Hugues_78 dans le forum Oracle
    Réponses: 11
    Dernier message: 10/10/2006, 18h27
  4. SQL standard vers les fonctions analytiques
    Par Emmanuel Lecoester dans le forum Oracle
    Réponses: 7
    Dernier message: 02/10/2006, 19h27
  5. Réponses: 4
    Dernier message: 18/08/2005, 16h11

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