【问题标题】:How to limit the results to 1 row in Oracle SQL [duplicate]如何在 Oracle SQL 中将结果限制为 1 行 [重复]
【发布时间】: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 - 您使用的是哪个版本?您是否试图找到订单最多的客户?
  • 它是一个在线编辑器,所以我不知道版本,但我正在努力寻找订单最多的客户。

标签: oracle


【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2013-11-13
      • 2019-07-14
      相关资源
      最近更新 更多