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

PL/SQL Oracle Discussion :

Le max d'un row_number


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 40
    Par défaut Le max d'un row_number
    Bonjour

    Je suis novice en SQL et j'aimerai savoir s'il est possible de récupérer le max d'un row_number.

    Je m'explique, j'ai une table sur laquelle j'ai effectué un row_number et j'aimerai récupérer la ligne avec le max du row_number.

    Est-il possible de le faire en une seule requête ??

    Mes deux prototypes de requête :
    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 filtre1 as
    (
      select row_number() OVER (PARTITION BY issuer_id ORDER BY issuer_id DESC) AS rk,
             t.*
        from mgu_sp_ei t
    order by issuer_id asc
    )
      ,  filtre2 as
    (
      select max(rk) as rank, action, issuer_id, published_name, legal_name,
             short_name, sector, sub_sector, country, state, region, sic, gic,
             naics, naic, tsec, cusip, cins, ticker, reserved
        from filtre1
    group by issuer_id, action, published_name, legal_name, short_name,
             sector, sub_sector, country, state, region, sic, gic, naics,
             naic, tsec, cusip, cins, ticker, reserved
    )
    select *
      from filtre2;
    Pour ce prototype je me retrouve avec toutes les lignes alors que le but c'est la ligne avec le max du row_number.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select max(row_number() OVER (PARTITION BY issuer_id ORDER BY issuer_id DESC)) AS rk,
             t.*
        from mgu_sp_ei t
    order by issuer_id asc;
    erreur ORA-30483 : fonctions de fenêtrage interdites ici

    Merci de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 40
    Par défaut
    Troisième prototype :
    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
    with filtre1 as
    (
      select row_number() OVER (PARTITION BY issuer_id ORDER BY issuer_id DESC) AS rk,
             t.*
        from mgu_sp_ei t
    order by issuer_id asc       
    )
      ,  filtre2 as
    (
    select max(rk) as rank,
           f.*
      from filtre1 f
    )
    select *
      from filtre2;
    La encore erreur :
    ORA-00937 : la fonction de groupe ne porte pas sur un groupe simple

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous voulez récupérer la dernière ligne du row_number() trié dans un sens cela revient à récupérer la première ligne avec les données triées dans l'autre sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH filtre1 AS
    (
      SELECT row_number() OVER (PARTITION BY issuer_id ORDER BY issuer_id ASC) AS rk,
             t.*
        FROM mgu_sp_ei t
    ORDER BY issuer_id ASC
    )
    select *
      from filtre1
     where rk = 1;
    Si vous voulez savoir combien il y a de valeurs, utilisez count(*) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT row_number() OVER (PARTITION BY issuer_id ORDER BY issuer_id DESC) AS rk,
             count(*) OVER (PARTITION BY issuer_id) as cnt,
             t.*
        FROM mgu_sp_ei t
    ORDER BY issuer_id ASC;
    Dans votre troisième requête, vous faites un MAX mais il n'y a pas de GROUP BY. C'est ce qu'indique le message d'erreur.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 40
    Par défaut
    Bonjour

    je vous remercie de votre réponse mais il se pose un petit problème : sur certains cas il ne me récupère pas la dernière ligne mais l'avant-dernière.

    En fait pour la table mgu_sp_ei, elle est chargé a partir SQL*Loader.
    Je peux avoir plusieurs lignes qui vont avoir les mêmes paramètres sauf au niveau d'un.

    Le problème peut venir du fait qu'il va trier des fois par ordre alphabétique et ce qui fait que je ne récupère pas la bonne ligne, un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    83	A	100016	African Development Bank	African Development Bank	AFDB	GLOBISS	FI	SUP		AUSNZ	9192	40101015	999010				V05973	1598Z	
    84	A	100016	African Development Bank	African Development Bank	AFDB	GLOBISS	SOV	SUP		AUSNZ	9192	40101015	999010				V05973	1598Z

    Dans cet exemple ce sont les deux dernières lignes de l'id 100016 sur les 84
    et la il ne récupère pas la dernière mais l'avant-dernière en utilisant votre requête.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et bien rajoutez des éléments à vos ORDER BY pour les rendre déterministes en fonction de votre besoin !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 40
    Par défaut
    C'est là où je bloque étant donné qu'en fonction des id les éléments vont changer.

    Auriez-vous une idée ?

    Merci encore.

Discussions similaires

  1. [11g] Différence d'exécution entre un max et un row_number
    Par bstevy dans le forum SQL
    Réponses: 2
    Dernier message: 20/01/2015, 01h08
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. Max
    Par MASSAKA dans le forum Requêtes
    Réponses: 8
    Dernier message: 14/01/2004, 17h44
  4. opengl et 3dstudio max
    Par maamar dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/09/2002, 20h48
  5. taille max du nom d'un champ
    Par hna dans le forum Paradox
    Réponses: 2
    Dernier message: 28/07/2002, 02h40

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