计算唯一购买日期的数量

Count number of unique purchase dates

我有客户的购买记录。有时,客户在给定的购买过程中购买了多件商品,有时他们只购买了一件商品。我想逐行确定发生了哪些购买事件(即不是逐个项目,而是逐个结帐)。

源数据库的每一行包含以下字段

cust_id, purchase_date, sku

所以在给定交易中购买了三件商品的客户看起来像这样

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日),只购买了一件商品,但是这是第二次购买事件,然后在第三次购买日期(2001 年 1 月 3 日)又购买了一件商品。

我正在尝试在 oracle10g 中执行此操作。我不确定如何描述我正在完成的事情。

这是我目前sql

SELECT cust_id、purchase_date、sku、ROW_NUMBER() OVER(按 purchase_date 按 sku 排序) 从 [table]

谢谢

您似乎想要 dense_rank() 而不是 row_number()(或 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 排序;第二个仅按客户分区,并按日期排序。