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 :

Sélectionner l'avant dernière ligne


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Points : 145
    Points
    145
    Par défaut Sélectionner l'avant dernière ligne
    Bonjour,

    je cherche à sélectionner dans une requête sql l'avant dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MAX(BEGINDTTM)  
      FROM PSPRCSRQST 
     WHERE PRCSNAME='name'
    cette requête me renvoie le maximum d'une date pour le PRCSNAME = name.
    Mon but est de récupérer le max -1.

    merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345

  3. #3
    Membre habitué Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Points : 145
    Points
    145
    Par défaut
    merci pour le lien, ça marche mais à moitié.

    En fait, ma requête renvoie 11 lignes mais quand je séléctionne la 10ème ligne, la requête me renvoie null. Pourtant la 10ème ligne existe

    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
     
    SELECT  rownum,a.*
        FROM  ( 
           SELECT * 
            FROM  PSPRCSRQST
    		where PRCSNAME='name'
            ORDER BY begindttm 
           ) a 
        WHERE  ROWNUM = (SELECT  max(ROWNUM) -1
    				    FROM  ( 
    				       SELECT * 
    				        FROM  PSPRCSRQST
    						where PRCSNAME='name'and
    						ORDER BY begindttm     
    				       ) ) ;
    la sous requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WHERE  ROWNUM = (SELECT  max(ROWNUM) -1
    				    FROM  ( 
    				       SELECT * 
    				        FROM  PSPRCSRQST
    						where PRCSNAME='name'and
    						ORDER BY begindttm
    me renvoie 10.
    j'ai testé avec 10 directement dans la reqête mais toujours le résultat est un null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  rownum,a.*
        FROM  ( 
           SELECT * 
            FROM  PSPRCSRQST
    		where PRCSNAME='name'
            ORDER BY begindttm 
           ) a 
        WHERE  ROWNUM = 10

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Normal : aucune ligne ne se trouve avoir rownum = 10 (la 1ère testée ne convient pas, donc la 2ème testée aurait rownum = 1 ne convient pas, etc.).
    Il faut faire un étage en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT *
       FROM
    (
    SELECT  rownum as rang,a.*
        FROM  ( 
           SELECT * 
            FROM  PSPRCSRQST
    		WHERE PRCSNAME='name'
            ORDER BY begindttm 
           ) a 
    )
    WHERE  rang = 10

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    C'est plus simple de trier à l'envers et prendre la 2eme ligne.
    Et avec row_number il y a moins d'étape qu'avec rownum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
      from (SELECT t.*, row_number() over (order by BEGINDTTM desc) as rn
              FROM PSPRCSRQST t
             WHERE PRCSNAME='name')
     where rn = 2
    Si besoin utilise dense_rank pour gérer des BEGINDTTM identiques.

  6. #6
    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
    un peu plus space

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct 
      nth_value(sal,2) 
        from last 
        ignore nulls 
        over (
          order by sal 
          rows between unbounded preceding and unbounded following
        ) 
    from emp

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    un peu plus space
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows between unbounded preceding and unbounded following
    Je ne connais même pas les mots clés de cette ligne

  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
    Citation Envoyé par Drawingrom Voir le message
    Je ne connais même pas les mots clés de cette ligne
    Quoi ? BETWEEN et AND ?


    laurentschneider nous fait toujours halluciner avec ses codes sortis des abysses d'Oracle.

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pourquoi tester la position d'un tuple, alors que votre cas peut s'ecrire de maniere fonctionnelle par :

    " Rechercher la valeur directement inférieure a la valeur max "

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
    	MAX(BEGINDTTM)
    FROM
    	PSPRCSQST 
    WHERE	
    	PRCSNAME='name'
    	AND
    	BEGINDTTM <
    	(SELECT MAX(BEGINDTTM)
    		FROM
    			PSPRCSQST 
    		WHERE	
    			PRCSNAME='name')
    A tester et a adapter bien sur !

    Votre regle fonctionnelle n'a rien a voir avec la position de vos données dans la table...

    A moins que je n'ai pas compris votre probleme initial.

    Bon courage

Discussions similaires

  1. SCD Type 1 et 2 - Ne pas modifier l'avant dernière ligne
    Par jpvigniel dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 07/04/2011, 12h48
  2. Sélectionner l'avant dernière ligne d'un tableau quelconque
    Par Erwan Narcos dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/01/2010, 13h25
  3. [AC-2003] Selectionner l'avant dernière ligne d'une requête
    Par Piccou dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/08/2009, 16h51
  4. Sélectionner l'avant dernière date
    Par harry le ravi dans le forum Requêtes
    Réponses: 12
    Dernier message: 30/07/2009, 12h36
  5. [MySQL] Sélectionner les 5 dernières lignes
    Par Empty_body dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/07/2007, 13h04

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