【问题标题】:Average Repurchase Rate with weeks after Date of First Purchase首次购买后几周的平均回购率
【发布时间】:2013-09-28 06:42:40
【问题描述】:

搜索博客、问题和答案,似乎大部分都与我的问题相关,但从未真正回答我的问题。因此,感谢任何花时间提供帮助的人一百万!

我使用 SQL Server 管理工作室 2008 R2。

我想比较客户的“平均回购率”。复购率 (RPR) 计算为自他/她的第一个订单之日起的订单数。

样本表

  • CustomerID / OrderDate / VKR_Number
  • D10001 / 2013-01-04 / VKR-1
  • D10001 / 2013-05-01 / VKR-2
  • D10001 / 2013-05-11 / VKR-3
  • D10001 / 2013-08-01 / VKR-4

定义: 累计数(回购): 自第一个订单以来的订单数量;这相当于订单总数减 1(即第一订单)

复购率(RPR):累计数(复购)/[时间间隔]

RPR 示例见上表: 客户 D10001 的累积 RPR 为

  • 自他/她在 OrderDate = '2013-01-04' 首次购买后的 17 周内计数 (VKR) = 1
  • 自他/她在 OrderDate = '2013-01-04' 首次购买后的 18 周内计数 (VKR) = 2
  • 自他/她在 OrderDate = '2013-01-04' 首次购买后的 30 周内计数 (VKR) = 3

最简单的版本(至少对于 TSQL 外行来说)似乎是:

`Select CustomerID,  COUNT([VKR_]) over (Partition by customer, DATEDIFF(week, Min([OrderDate ]), [OrderDate ])) as CountOfOrders, DATEDIFF(week, Min([OrderDate ]), [OrderDate ]) as WeeksPassedSinceDateOfFirstPurchase`

所需的结果表如下所示

  • CustomerID/WeeksPassedSinceDateOfFirstPurchase/CountOfOrders
  • D10001 / 17 / 1
  • D10001 / 18 / 2
  • D10001 / 30 / 3

如果上述要求在 TSQL 中太难实现,我也很乐意得到类似的结果表

  • CustomerID/WeeksPassedSinceDateOfFirstPurchase/CountOfOrders
  • D10001 / 1 / 0
  • D10001 / 2 / 0
  • D10001 / 3 / 0
  • D10001 / 4 / 0
  • D10001 / 5 / 0
  • D10001 / 6 / 0
  • D10001 / 17 / 1
  • D10001 / 18 / 2
  • D10001 / 19 / 2
  • D10001 / 20 / 2
  • D10001 / 21 / 2
  • D10001 / 29 / 2
  • D10001 / 30 / 3

再次,非常感谢您的任何建议!抱歉,如果我错过了任何博客/答案,这已经解决了我的问题。

【问题讨论】:

    标签: sql sql-server count


    【解决方案1】:

    这应该可行。

    SELECT CustID
        ,DATEDIFF(ww,OrderDate,GETDATE()) 'WEEKS'
        ,(SELECT COUNT(1) 
           from Table t2 
           where t1.custID=t2.custID 
              and t2.OrderDate<=t1.OrderDate 
           GROUP BY t2.CustID)-1 as CountOrders
    FROM TABLE t1
    GROUP BY CustID,OrderDate
    ORDER BY OrderDate
    

    从问题来看,您似乎不需要平均值,只是计数-1,如果不是这种情况,请澄清。这应该会给你你要求的结果表。如果您得到的是每周平均订单量,您可能希望将我的第二列和第三列合并起来。

    【讨论】:

    • 如果可以在同一天有2个订单,您可能需要介绍订单号...
    • 谢谢。正确,我不是在寻找平均值。我更改了这样的语句,即 DATEDIFF 不使用 GETDATE() 而是使用 FirstOrderDate。 with cte as ( Select Customer, [OrderDate] , MIN([OrderDate]) over (Partition by Customer) as FirstOrderDate, [VKR_] FROM Table t1 ) SELECT Customer ,DATEDIFF(ww,FirstOrderDate,[PostingDate]) 'WEEKS' etc. `
    • 问题:计数不在计算的时间间隔 (DATEDIFF) 内,但计数总是不累积的订单总数!请再看Desired Table 1:17周后有1个订单,18周后有2个订单,30周后有3个订单。使用当前的语句,我总是数到 3。非常感谢您的帮助!
    • 我的子查询 where 子句中的错字,以及我编辑的 t2.OrderDate
    • 根据问题,您显示周数的方式确实更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多