1

私はOracle SQLで働いています。次の項目をリストした表があるとします。

テーブル

PurchaseID    CustID      Location       Date  
    1            1           A        8/23/2013 12:00:00 AM  
    2            1           B        8/15/2013 12:00:00 AM  
    3            2           A        5/15/2013 12:00:00 AM  
    4            2           B        1/01/2005 12:00:00 AM  
    5            3           A        1/15/2001 12:00:00 AM  
    6            3           A        1/30/2001 12:00:00 AM  
    7            3           B        8/23/2013 12:00:00 AM  
    8            4           A        5/05/2012 12:00:00 AM
    9            4           B        8/15/2010 12:00:00 AM
    10           4           A        9/20/2008 12:00:00 AM  

特定の顧客が2年以内に2つの異なる場所で購入したすべてのインスタンスが出力されるように、顧客ごとの購入を比較するクエリを作成しようとしています。場所/日付の組み合わせが難しい CustID=3 および CustID=4 タイプのケースで特につまずきます。クエリの出力は次のようになります。

PurchaseID    CustID      Location       Date  
    1            1           A        8/23/2013 12:00:00 AM  
    2            1           B        8/15/2013 12:00:00 AM   
    8            4           A        5/05/2012 12:00:00 AM
    9            4           B        8/15/2010 12:00:00 AM
    10           4           A        9/20/2008 12:00:00 AM

出力では、CustID=1 の購入が返されます。これは、互いに 2 年以内に異なる場所にあるためです。CustID=2 は 2 年以内ではないため除外されます。CustID=3 は 2 年以内に 2 回購入していますが、同じ場所にあるため破棄されます。また、CustID=4 の購入は保持されます。これは、購入 8 と 9 が 2 年以内で別の場所にあり、9 と 10 が 2 年以内に別の場所にあるためです (8 と 10 が同じ場所にあり、 10年以内ではない)。

注: Date 列には、Oracle SQL 'Date' データ型があります。

いつものように、ヘルプ/ガイダンスは大歓迎です。

4

1 に答える 1

2

次または前の場所が現在の場所と異なる場合に検索を制限できます。次に、時間差を見て行を選択します。

lag()これはandを多用しますlead():

select t.PruchaseId, t.CustId, t.Location, t.Date
from (select t.*,
             lag(location) over (partition by CustId order by Date) as prevloc,
             lead(location) over (partition by CustId order by Date) as nextloc,
             lag(date) over (partition by CustId order by Date) as prevdate,
             lead(date) over (partition by CustId order by Date) as nextdate
      from t
     ) t
where ((prevloc <> location) and (add_months(prevdate, 2*12) > date)) or
      ((nextloc <> location) and (add_months(date, 2*12) > nextdate));
于 2013-08-23T18:52:08.323 に答える