Réponses:
Si vous souhaitez uniquement une première ligne sélectionnée, vous pouvez:
select fname from MyTbl where rownum = 1
Vous pouvez également utiliser des fonctions analytiques pour commander et prendre le top x:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
quelqu'un peut le changer enWHERE ROWNUM <= X
Avec Oracle 12c (juin 2013), vous pouvez l'utiliser comme suit.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
n'est apparemment pas nécessaire, vous pouvez utiliser FETCH NEXT 1 ROWS ONLY
ou même FETCH FIRST ROW ONLY
, l'ordre par est important ou ce sera équivalent à simplement utiliser un WHERE rownum = 1
. Je l'ai même essayé dans une instruction OUTER APPLY et cela a fonctionné comme la fonction TOP de Ms-SQL.
TIES
. Reportez - vous ceci pour les cas où des liens se produisent pour la version 12c +
et12c -
Vous pouvez utiliser ROW_NUMBER()
une ORDER BY
clause en sous-requête et utiliser cette colonne en remplacement de TOP N
. Cela peut être expliqué étape par étape.
Voir le tableau ci-dessous qui a deux colonnes NAME
et DT_CREATED
.
Si vous devez prendre uniquement les deux premières dates indépendamment de NAME
, vous pouvez utiliser la requête ci-dessous. La logique a été écrite dans la requête
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
RÉSULTAT
Dans certaines situations, nous devons sélectionner des TOP N
résultats respectifs à chacun NAME
. Dans ce cas, nous pouvons utiliser PARTITION BY
une ORDER BY
clause en sous-requête. Reportez-vous à la requête ci-dessous.
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
RÉSULTAT
with (select ... ) as
clause) ne change rien à ce problème, CTE vise simplement à lire et à prendre en charge les requêtes. Droite? @Sarath Avanavu
Vous pouvez faire quelque chose comme
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Vous pouvez également utiliser les fonctions analytiques RANK et / ou DENSE_RANK , mais ROWNUM est probablement la plus simple.
Utilisation:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Si vous utilisez Oracle9i +, vous pouvez envisager d' utiliser des fonctions analytiques comme ROW_NUMBER (), mais elles ne fonctionneront pas aussi bien que ROWNUM .
Pour sélectionner la première ligne d'un tableau et pour sélectionner une ligne dans un tableau, deux tâches différentes nécessitent une requête différente. Il existe de nombreuses façons de le faire. Quatre d'entre eux sont:
Première
select max(Fname) from MyTbl;
Seconde
select min(Fname) from MyTbl;
Troisième
select Fname from MyTbl where rownum = 1;
Quatrième
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
J'ai eu le même problème, et je peux résoudre ce problème avec cette solution:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Vous pouvez commander votre résultat avant d'avoir la première valeur en haut.
Bonne chance