Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle10g 计算唯一购买日期的数量_Oracle10g - Fatal编程技术网

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