0

結果を 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;
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
;

以下のクエリを使用して単一の注文を取得し、最長の遅延が引き分けの場合に最も低い注文番号を取得します。(常に決定的な結果を得るために努力する必要があります)これが最適なソリューションであり、データを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 に答える