【问题标题】:按实例跟踪状态更改的数量
【发布时间】:2022-01-23 14:59:58
【问题描述】:

我需要跟踪一位客户如何从一种状态变为另一种状态,并跟踪其在每种状态下的行为。我有下表:

Name - Purchase_date - Customer_category
Susan - 01_01_2021 - A
Susan - 02_01_2021 - B
Susan - 03_01_2021 - B
Susan - 04_01_2021 - B
Susan - 05_01_2021 - B
Susan - 06_01_2021 - A
Susan - 07_01_2021 - A
Susan - 08_01_2021 - B
Susan - 09_01_2021 - B
Susan - 10_01_2021 - B
Susan - 11_01_2021 - C
Susan - 12_01_2021 - D

预期结果是一个包含两行额外的表,category_switch_numberoccurences_number,其中 category_switch_number 显示了该特定客户的开关 (从 1) 开始计数,occurences_number 显示购买次数,当客户属于此类别时:

Name - Purchase_date - Customer_category - category_switch_number - occurences_number
Susan - 01_01_2021 - A - 1 - 1
Susan - 02_01_2021 - B - 2 - 4
Susan - 03_01_2021 - B - 2 - 4
Susan - 04_01_2021 - B - 2 - 4
Susan - 05_01_2021 - B - 2 - 4
Susan - 06_01_2021 - A - 3 - 2
Susan - 07_01_2021 - A - 3 - 2
Susan - 08_01_2021 - B - 4 - 3
Susan - 09_01_2021 - B - 4 - 3
Susan - 10_01_2021 - B - 4 - 3
Susan - 11_01_2021 - C - 5 - 1
Susan - 12_01_2021 - D - 6 - 1

要复制此表并尝试自己运行查询,请参阅下面的表创建语句:

CREATE TABLE Table1
    (`Customer_id` varchar(5), `purchase_time` varchar(10), `Customer_category` varchar(1), `category_switch_number` int, `occurences_number` int)
GO
    
INSERT INTO Table1
    (`Customer_id`, `purchase_time`, `Customer_category`, `category_switch_number`, `occurences_number`)
VALUES
    ('Susan', '01_01_2021', 'A', 1, 1),
    ('Susan', '02_01_2021', 'B', 2, 4),
    ('Susan', '03_01_2021', 'B', 2, 4),
    ('Susan', '04_01_2021', 'B', 2, 4),
    ('Susan', '05_01_2021', 'B', 2, 4),
    ('Susan', '06_01_2021', 'A', 3, 2),
    ('Susan', '07_01_2021', 'A', 3, 2),
    ('Susan', '08_01_2021', 'B', 4, 3),
    ('Susan', '09_01_2021', 'B', 4, 3),
    ('Susan', '10_01_2021', 'B', 4, 3),
    ('Susan', '11_01_2021', 'C', 5, 1),
    ('Susan', '12_01_2021', 'D', 6, 1)
GO

我很抱歉没有分享我尝试过的内容,因为代码示例(我觉得更有用)这篇文章已经很大了,但展示我尝试过的内容会让它变得更大。

【问题讨论】:

    标签: sql amazon-redshift window-functions


    【解决方案1】:

    第 1 步 创建一个带有窗口函数的cte,根据购买时间查找客户之前的购买类别。

    第 2 步 使用步骤 1 中的 cte,创建每个序列的分组,其中客户类别从一个购买日期到下一个购买日期都是相同的。当客户类别发生变化时,增加该序列分组。这是通过使用运行总和窗口函数来完成的。

    第 3 步 使用步骤 2 中的 cte,对客户和序列分组使用最终的 count() 窗口函数,这将计算客户在该类别中的连续次数。

    with priors as (
      select t.*
        , lag(t.customer_category) over(partition by t.customer_id order by t.purchase_time) as prior_category
      from Table1 t
     ),
     
      
     category_seq_grps as (
       select t2.*
        , sum(case when t2.prior_category = t2.customer_category then 0 else 1 end) over(partition by  t2.customer_id order by t2.purchase_time rows unbounded preceding) as cust_cat_seq_grouping
       from priors t2
       )
    
    
     select csg.customer_id
        , csg.purchase_time
        , csg.customer_category
        , csg.cust_cat_seq_grouping as category_switch_number
        , count(*) over(partition by csg.customer_id,    csg.cust_cat_seq_grouping) as occurences_number
     from category_seq_grps csg
     order by csg.customer_id
        , csg.purchase_time
    ;
    

    这里有一个小提琴来演示。感谢您提供问题的数据、结果和 DDL。

    https://www.db-fiddle.com/f/8er78RNugk9TWQPzx5xdXP/1

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2022-01-24
      • 2015-11-15
      • 2011-01-21
      • 1970-01-01
      • 2016-05-10
      • 2012-12-08
      • 2016-11-13
      相关资源
      最近更新 更多