0

我有这个查询,它按 ORDER# 对结果进行分组。

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

我的目标是退回发货延迟最长的单个 ORDER#。不是整套。我怎样才能做到这一点?

这个也试过了。不工作。这给了我单列,但不是 ORDER#。

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

2 回答 2

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

于 2012-06-30T00:02:49.733 回答
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#)

编辑 - 我知道有更好的方法。只是花了一点时间。我被挂断了,以为我必须确定每个订单的最大延迟#,但后来我意识到这个查询没有必要。

于 2012-06-30T00:23:22.377 回答