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之前肯定不起作用,但现在看起来还可以。