计算唯一购买日期的数量
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 排序;第二个仅按客户分区,并按日期排序。
我有客户的购买记录。有时,客户在给定的购买过程中购买了多件商品,有时他们只购买了一件商品。我想逐行确定发生了哪些购买事件(即不是逐个项目,而是逐个结帐)。
源数据库的每一行包含以下字段
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 排序;第二个仅按客户分区,并按日期排序。