Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/07/2011, 10h38   #1
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
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 :
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
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h41   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,


http://oracle.developpez.com/faq/?page=3-1#rownum
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 11h43   #3
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
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 :
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 :
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 :
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
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 12h13   #4
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
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 :
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
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 13h09   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/07/2011, 11h14   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
un peu plus space

Code :
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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/07/2011, 18h47   #7
Membre confirmé
 
Inscription : mai 2006
Messages : 179
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 179
Points : 211
Points : 211
Citation:
Envoyé par laurentschneider Voir le message
un peu plus space
...
Code :
rows BETWEEN unbounded preceding AND unbounded following
Je ne connais même pas les mots clés de cette ligne
Drawingrom est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/07/2011, 00h06   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
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.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/07/2011, 10h11   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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 :
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
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h02.


 
 
 
 
Partenaires

Hébergement Web