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