Sql 如何从Oracle 11G查询中选择其他列?

Sql 如何从Oracle 11G查询中选择其他列?,sql,oracle,Sql,Oracle,我有一个按顺序对结果进行分组的查询 SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS FROM ORDERS GROUP BY ORDER#; 我的目标是退回发货延迟时间最长的单笔订单。不是全部。我怎样才能做到这一点 我也试过这个。不起作用。这给了我一列,但没有顺序 SELECT MAX(X.DELAYDAYS) FROM (SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS

我有一个按顺序对结果进行分组的查询

SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS FROM ORDERS GROUP BY ORDER#;
我的目标是退回发货延迟时间最长的单笔订单。不是全部。我怎样才能做到这一点

我也试过这个。不起作用。这给了我一列,但没有顺序

SELECT MAX(X.DELAYDAYS) FROM
   (SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS 
    FROM ORDERS GROUP BY ORDER#) X;
也许是这个

SELECT X.ORDER# 
FROM (
  SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS 
  FROM ORDERS 
  GROUP BY ORDER#
  ORDER BY DELAYDAYS DESC
  ) X
WHERE ROWNUM = 1;

但是,如果在延迟天数内出现平局,则不会给出一致的结果。

要获得所有在最长延迟时间内平局的订单的列表:

with order_delay as (
  select order#,
           max( shipdate - orderdate ) as delayDays
      from orders
     group by order#
),
ranked_order_delay as (
  select order#,
         delayDays,
         rank() over( order by delayDays desc ) as delayRank
    from order_delay
)
select order#, delayDays from ranked_order_delay
 where delayRank=1
;
使用下面的查询获取单个订单,在出现最长延迟的情况下,取最低订单。我相信这是最佳的解决方案,只需要通过一次数据

select min(order#) keep (dense_rank last order by (shipdate-orderdate)) as order#,
       max(shipdate-orderdate) delaydays
  from orders
若要在最长延迟的情况下采用最高阶,只需使用maxorder即可


编辑-我知道有更好的方法。只是耍了个花招。我挂断了电话,以为我必须确定每个订单的最大延迟,但后来我意识到这对于这个查询来说是不必要的。

您可以通过以下方式扩展订单,使答案一致:order by DELAYDAYS DESC,order有很多相互冲突的信息。有些声明您不应在Oracle子查询中使用ORDER BY:。其他人则声称,自Oracle 8i 1.1版以来,只要您正确使用它,它就可以了:。它在8i之前肯定不起作用,但现在看起来还可以。