2017-06-20 4 views
0

お客様からの購入履歴があります。ある顧客がある購入で複数の商品を購入する場合もあれば、単一の商品のみを購入する場合もあります。私が行単位で行うことは、発生した購入イベント(アイテム単位ではなく、チェックアウト単位でのチェックアウト)を特定することです。一意の購入日のカウント数

ソースデータベースの各行は、私が

されて欲しいもの

cust_id, purchase_date, sku 

だから与えられたトランザクション中3アイテムを購入したお客様は、この

1, 01/01/01, dog1 
1, 01/01/01, cat1 
1, 01/01/01, mouse1 
1, 01/02/01, wolf1 
1, 01/03/01, lion1 

ようになり、次のフィールドが含まれています

cust_id, purchase_date, sku, item_purchase_number_within_purchase, unique_purchase_date_across_dates 

それは

のようになりますすなわち
1, 01/01/01, dog1, 1, 1 
1, 01/01/01, cat1, 2, 1 
1, 01/01/01, mouse1, 3, 1 
1, 01/02/01, wolf1, 1, 2 
1, 01/03/01, lion1, 1, 3 

、最初の日に、任意の購入数、1、2、および3として識別購入し三つの項目は、第二の購入日(2001年1月2日)には、単一のアイテムが購入ました、これは2回目の購買イベントで、3回目の購買日(2001年1月3日)にもう1つの単一アイテムが購入されました。

私はoracle10gでこれを実行しようとしています。私は自分が成し遂げていることを説明する方法がわからない。

これは、SQLは、私がこれまで

が FROM [テーブル]

おかげ

+0

なぜ最初の3つはすべて同じ 'イベント'ですか?特定の日付の同じ顧客によるすべての購入が1つのイベントであると仮定していますか? –

+0

顧客IDと日付が同じです。 –

+0

はい、わかりやすくするために、この例では、特定の日付の同じ顧客によるすべての購入が1つのイベントであると仮定しています。合計のタイムスタンプを入れるよりも簡単でした。 –

答えて

3
を CUST_ID、PURCHASE_DATE、SKU、ROW_NUMBER()OVER(SKU BY PURCHASE_DATEのORDER BY PARTITION)を選択していています

ギャップを避けるには、row_number()(またはrank())ではなく、dense_rank()が必要です。 CTEでのサンプルデータで:

with t (cust_id, purchase_date, sku) as (
    select 1, date '2001-01-01', 'dog1' from dual 
    union all select 1, date '2001-01-01', 'cat1' from dual 
    union all select 1, date '2001-01-01', 'mouse1' from dual 
    union all select 1, date '2001-01-02', 'wolf1' from dual 
    union all select 1, date '2001-01-03', 'lion1' from dual 
) 
select cust_id, purchase_date, sku, 
    dense_rank() over (partition by cust_id, purchase_date order by sku) 
    as item_within_purchase, 
    dense_rank() over (partition by cust_id order by purchase_date) 
    as purchase_event 
from t; 

    CUST_ID PURCHASE_D SKU ITEM_WITHIN_PURCHASE PURCHASE_EVENT 
---------- ---------- ------ -------------------- -------------- 
     1 2001-01-01 cat1      1    1 
     1 2001-01-01 dog1      2    1 
     1 2001-01-01 mouse1     3    1 
     1 2001-01-02 wolf1      1    2 
     1 2001-01-03 lion1      1    3 

最初の余分な列は、パーティションは、顧客と日付の両方であり、そして、あなたが持っていたとしてSKUが注文しました。 2番目は顧客によって区分され、日付順に並んでいます。

+0

私は受注線と顧客注文の数を考えていましたが、ええ:P – xQbert

関連する問題