遅延が最も長いすべての注文のリストを取得するには:
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#)
代わりに単純に使用します。
編集 - もっと良い方法があることはわかっていました。手間がかかりました。各注文番号の最大遅延を決定する必要があると思って電話を切りましたが、このクエリには必要ないことに気付きました。