如何在 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 行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中将 SQL 结果限制为 2 个小数位

如何在 Oracle 中将结果从 1000 转换为 1000.00? [复制]

ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0

如何在过程oracle中将表名设置为参数

在 ORACLE SQL 中将一组列转换为行

如何在sql中将数字转换为日期