我该怎么做呢?
select top 1 Fname from MyTbl
在Oracle 11g?
我该怎么做呢?
select top 1 Fname from MyTbl
在Oracle 11g?
当前回答
您可以在子查询中使用带有ORDER BY子句的ROW_NUMBER(),并使用此列替换TOP n。这可以逐步解释。
请参阅下面的表,其中有两个列NAME和DT_CREATED。
如果只需要取前两个日期而不考虑NAME,可以使用下面的查询。逻辑已经在查询中编写
-- 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;
结果
在某些情况下,我们需要选择与每个NAME对应的TOP N结果。在这种情况下,我们可以在子查询中使用PARTITION BY和ORDER BY子句。参考下面的查询。
-- 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;
结果
其他回答
select * from (
select FName from MyTbl
)
where rownum <= 1;
你可以这样做
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
您也可以使用分析函数RANK和/或DENSE_RANK,但ROWNUM可能是最简单的。
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
您可以在子查询中使用带有ORDER BY子句的ROW_NUMBER(),并使用此列替换TOP n。这可以逐步解释。
请参阅下面的表,其中有两个列NAME和DT_CREATED。
如果只需要取前两个日期而不考虑NAME,可以使用下面的查询。逻辑已经在查询中编写
-- 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;
结果
在某些情况下,我们需要选择与每个NAME对应的TOP N结果。在这种情况下,我们可以在子查询中使用PARTITION BY和ORDER BY子句。参考下面的查询。
-- 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;
结果
我也遇到过同样的问题,我可以用这个解决方案来解决这个问题:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
您可以将结果排序,使第一个值在上面。
祝你好运