Oracle10g 计算唯一购买日期的数量
我有客户购买的记录。有时,一个客户在一个给定的购买过程中购买多个项目,有时他们只购买一个项目。我要做的是,逐行识别发生了哪些购买事件(即,不是逐项,而是逐项结帐) 源数据库的每一行都包含以下字段Oracle10g 计算唯一购买日期的数量,oracle10g,Oracle10g,我有客户购买的记录。有时,一个客户在一个给定的购买过程中购买多个项目,有时他们只购买一个项目。我要做的是,逐行识别发生了哪些购买事件(即,不是逐项,而是逐项结帐) 源数据库的每一行都包含以下字段 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
因此,在给定交易期间购买三件商品的客户如下所示
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
挑选
客户id、采购日期、sku、行号()超过(按采购日期、订单和sku划分)
从…起
[附表]
谢谢您似乎希望
密集排列()
而不是行编号()
(或排列()
)以避免出现间隙。使用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进行排序;第二个仅按客户划分,并按日期排序。您似乎想要
密集的列号()
,而不是行号()
(或列号()
)以避免出现间隙。使用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进行排序;第二个仅按客户划分,并按日期排序。为什么前三个都是相同的“事件”-您假设同一客户在给定日期的所有购买都是一个事件?它们具有相同的客户id和相同的日期。是的,为了简单起见,在本例中,我假设同一客户在给定日期的所有购买都是一个事件。这比加总时间戳简单。为什么前三个都是相同的“事件”-你假设同一客户在给定日期的所有购买都是一个事件?它们具有相同的客户id和相同的日期。是的,为了简单起见,在本例中,我假设同一客户在给定日期的所有购买都是一个事件。这比加上总时间戳要简单。我想的是订单行与客户订单之比,但是的:PI想的是订单行与客户订单之比,但是的:P