2017-06-20 5 views
0

Ich habe ein Protokoll der Käufe von Kunden gemacht. Manchmal kauft ein Kunde während eines Kaufs mehrere Artikel, manchmal kauft er nur einen Artikel. Was ich Zeile für Zeile machen möchte, ist, welche Kaufereignisse stattgefunden haben (d. H. Nicht auf einer Einzelposten-Basis, sondern auf einer Kauf-Kasse-Basis).Anzahl der eindeutigen Kaufdaten

Jede Zeile der Quelldatenbank enthält die folgenden Felder

cust_id, purchase_date, sku 

So ein Kunde, der drei Gegenstände bei einer bestimmten Transaktion kauft wie diese

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 

aussehen würde, was ich will heraus

cust_id, purchase_date, sku, item_purchase_number_within_purchase, unique_purchase_date_across_dates 

Und das würde wie

aussehen Kauf
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 

In Worten, am ersten Tag, in die drei Elemente als Kauf Zahlen willkürlich identifiziert gekauft, 1, 2 und 3 auf dem zweiten Kaufdatum (2. Januar 2001), waren nur ein einzelne Element, Dies war jedoch das zweite Kaufereignis, und am dritten Kaufdatum (3. Januar 2001) wurde ein weiterer einzelner Artikel gekauft.

Ich versuche dies in oracle10g zu tun. Ich bin mir nicht sicher, wie ich beschreiben soll, was ich beende.

Dies ist die SQL-I

SELECT cust_id, PURCHASE_DATE, sku so weit haben, ROW_NUMBER() OVER (PARTITION BY PURCHASE_DATE ORDER BY sku) VON [Tabelle]

Dank

+0

Warum sind die ersten drei alle gleich "Event" - Sie gehen davon aus, dass alle Käufe eines Kunden an einem bestimmten Datum ein Ereignis sind? –

+0

Sie haben die gleiche Kundennummer und das gleiche Datum. –

+0

Ja, der Einfachheit halber und in diesem Beispiel gehe ich davon aus, dass alle Einkäufe desselben Kunden an einem bestimmten Datum ein Ereignis sind. Es war einfacher, als einen Zeitstempel zu setzen. –

Antwort

3

Sie scheinen dense_rank() statt row_number() (oder rank()) zu wollen, um Lücken zu vermeiden. Mit Ihren Beispieldaten in einem WAK:

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 

Die erste zusätzliche Spalte ist sowohl Partition durch die Kunden und das Datum und die Sortierung nach Artikelnummer, wie Sie hatte; die zweite wird nur vom Kunden partitioniert und nach Datum sortiert.

+0

Ich dachte, Bestellungszeilen vs # von Kundenbestellungen, aber ja: P – xQbert

Verwandte Themen