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

时间:2012-06-29 23:41:36

标签: sql oracle

我有这个查询按ORDER#。

对结果进行分组
SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS FROM ORDERS GROUP BY ORDER#;

我的目标是返回运费延迟最长的单个订单#。不是整套。我怎么能做到这一点?

也试过这个。不行。这给了我一个列,但不是ORDER#。

SELECT MAX(X.DELAYDAYS) FROM
   (SELECT ORDER#, MAX(SHIPDATE - ORDERDATE) DELAYDAYS 
    FROM ORDERS GROUP BY ORDER#) X;

2 个答案:

答案 0 :(得分:1)

也许这个?

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

如果DELAYDAYS中存在平局,则不会给出一致的结果。

答案 1 :(得分: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

如果出现最长延迟的平局,请采取最高顺序#,然后只需使用max(order#)

编辑 - 我知道有更好的方法。它只是诡计多端。我被挂起来以为我必须确定每个订单#的最大延迟,但后来我意识到这个查询没有必要。