如何在 Oracle SQL 中将结果限制为 1 行 [重复]
Posted
技术标签:
【中文标题】如何在 Oracle SQL 中将结果限制为 1 行 [重复]【英文标题】:How to limit the results to 1 row in Oracle SQL [duplicate] 【发布时间】:2017-05-04 09:41:46 【问题描述】:我有这个成功运行的查询
SELECT customerNumber
FROM ORDERS
GROUP BY customerNumber
ORDER BY count(orderNumber) DESC
但是当我尝试将返回的行数限制为 1 时,出现以下错误
ORA-00933: SQL command not properly ended
这是我尝试过的:
SELECT customerNumber
FROM ORDERS
GROUP BY customerNumber
ORDER BY count(orderNumber) DESC
fetch first 1 row only;
和
SELECT customerNumber
FROM ORDERS
GROUP BY customerNumber
ORDER BY count(orderNumber) DESC
WHERE ROWNUM=1;
【问题讨论】:
fetch first 1 row only;
需要 Oracle 12 - 您使用的是哪个版本?您是否试图找到订单最多的客户?
它是一个在线编辑器,所以我不知道版本,但我正在努力寻找订单最多的客户。
【参考方案1】:
在 Oracle 中,您需要先进行排序,然后选择 rownum
。因此,您需要嵌套返回排序数据的查询,并将过滤WHERE
子句放在外面。
SELECT * FROM
(
SELECT customerNumber
FROM ORDERS
GROUP BY customerNumber
ORDER BY count(orderNumber) DESC
) resultSet
WHERE ROWNUM=1;
【讨论】:
谢谢!它也可以在不使用resultSet
的情况下工作。为什么需要这样做?
@Satwik 哦,这在 SQL Server 中是必需的。我通过反射添加了它,因为我已经有一段时间没有与 Oracle 合作了。对于这个查询,如果您使用的是 Oracle,您可以将其取出。 More info on why I added the alias to the result set.【参考方案2】:
where 条件必须放在 order by 之前(但似乎您需要排序完成后的第一行)
所以你应该使用 select this wya
select * from (
SELECT customerNumber
FROM ORDERS
GROUP BY customerNumber
ORDER BY count(orderNumber) DESC
) t
WHERE ROWNUM=1;
【讨论】:
【参考方案3】:您可以结合分组和窗口函数来完成此操作。
select customernumber, num_orders
from (
SELECT customerNumber,
count(*) as num_orders,
dense_rank() over (order by count(*) desc) as rnk
from orders
group by customerNumber
) t
where rnk = 1;
与简单的“只给我一行”不同的是,这也会返回具有相同数量订单的多个客户。如果您不希望这样,请将dense_rank()
替换为row_number()
【讨论】:
以上是关于如何在 Oracle SQL 中将结果限制为 1 行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle 中将结果从 1000 转换为 1000.00? [复制]