Oracleのテーブルでシーケンスギャップを見つける
問題データ内の数列または日付と時刻のすべてのギャップを見つけたいとします。ギャップは、
特定のアクションについて記録された日付、または論理的に連続した性質を持つ他のデータにある可能性があります。
ソリューション
OracleのLAGおよびLEADOLAP関数を使用すると、結果の現在の行を比較できます。
LAGの一般的な形式は次のようになります
Lag(列または式、前の行のオフセット、最初の行のデフォルト)
列または式は、比較する値です遅れている(先行する)値を使用します。前の
行オフセットは、LAGが現在の行より前の行数に対して作用する必要があることを示します。次のリストでは、現在の行の1つ前の行を意味するために「1」を使用しています。 LAGのデフォルトは、テーブルまたは結果に行0がないため、最初の行の前例として使用する
値を示します。 Oracleに、デフォルトのアンカー値として0を使用するように指示し、
月の最初の前日を検索する場合を処理します。
WITHクエリエイリアスアプローチを使用できます。サブクエリが使用されるほとんどすべての状況で、
メインクエリの前にサブクエリの詳細を再配置します。これは、
後日必要になった場合に、コードの読みやすさとリファクタリングを支援します。
このレシピは、1999年11月の
注文が行われた日のシーケンスのギャップを探します。
営業日を
(select extract(day from order_date)next_sale、
lag(extract(day from order_date)、1,0)
over(order by extract(day from order_date))prev_sale
from oe.orders
where order_date between '01 -NOV-1999' and '30 -NOV-1999')
select prev_sale、next_sale
from salesdays
where next_sale --prev_sale> 1
prev_saleで注文;
私たちのクエリは、1999年11月の売上間のギャップを日数で明らかにします。
PREV_SALE NEXT_SALE
---------- ----------
1 10
10 14
15 19
20 22
結果は、注文が月の1日に記録された後、それ以降の注文は10日まで
記録されなかったことを示しています。その後、4日間のギャップが14日に続き、以下同様に続きます。賢明な営業マネージャーは、
このデータを使用して、営業チームがそのギャップの日に何をしていたのか、なぜ注文が入らなかったのかを尋ねる可能性があります