【问题标题】:SQL Rolling LTV (Lifetime Value)SQL 滚动 LTV(生命周期价值)
【发布时间】:2021-08-09 01:09:49
【问题描述】:

我正在尝试滚动计算客户生命周期价值。我使用的基本公式是'SUM(revenue) / COUNT(DISTINCT CUSTOMERS)',但是当试图从它向后移动的任何一天获取这些数字时遇到了问题。我下面的代码不正确,但也尝试了同样不起作用的 PARTITION 代码。

    CREATE TEMP TABLE customer_revenue AS 
    (
    SELECT TRUNC(timestamp) AS "order_date", COUNT(DISTINCT customer_email) AS "customers", 
      SUM(revenue)-SUM(discount)-SUM(shipping)-SUM(tax) AS "revenue"
    FROM public.fact_shopify_orders
    GROUP BY TRUNC(timestamp)
    );

    SELECT TRUNC(SO.timestamp) AS "date", SUM(CR.revenue) / COUNT(customers) AS "LTV"
    FROM customer_revenue CR
    LEFT JOIN public.fact_shopify_orders SO ON CR.order_date = SO.timestamp 
    WHERE CR.order_date <= SO.timestamp
    GROUP BY TRUNC(SO.timestamp)
    ORDER BY TRUNC(SO.timestamp) DESC

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 由于公司政策,我无法提供示例数据,但我想要的是按天计算的 LTV,所以假设我想要 5/15/21 我想要订单日期为或21 年 5 月 15 日之前订购的唯一客户数量

标签: sql amazon-redshift partition rolling-computation


【解决方案1】:

我想你想要滚动和count(distinct)。后者有点棘手,但您可以使用基于第一次看到客户的标志轻松模拟它:

SELECT date,
       ( SUM(SUM(net_revenue)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) /
         SUM(SUM( (seqnum = 1)::int )) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
        ) as LTV
FROM (SELECT so.*, TRUNC(SO.timestamp) as date,
             (revenue - discount - shipping - tax) as net_revenue,
             ROW_NUMBER() OVER (PARTITION BY customer_email ORDER BY timestamp) as seqnum
      FROM public.fact_shopify_orders so
     ) so
GROUP BY date;

编辑:

我认为 Redshift 支持带有聚合的窗口函数。 . .但是有一些数据库没有。你可以试试这个:

SELECT date,
       ( SUM(net_revenue) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) /
         SUM(num_firsts) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
        ) as LTV
FROM (SELECT date, SUM(net_revenue) as net_revenue,
             SUM( (seqnum = 1)::int ) as num_firsts
      FROM (SELECT so.*, TRUNC(SO.timestamp) as date,
                   (revenue - discount - shipping - tax) as net_revenue,
                   ROW_NUMBER() OVER (PARTITION BY customer_email ORDER BY timestamp) as seqnum
            FROM public.fact_shopify_orders so
           ) so
      GROUP BY date
     ) so;

Here 是在 Postgres 中运行的类似版本。

【讨论】:

  • 由于亚马逊 redshift sql 的 SUM(SUM( 你的代码的一部分。你不能对分区使用两个函数
  • 我仍然收到红移错误。试图通过它进行故障排除
  • 我使用下面的代码并在 21 年 5 月 19 日获得了 230.35 美元的 LTV,而仅使用 (SUM(SO.revenue)-SUM(SO.discount)-SUM(SO.shipping)-SUM 获得了 250.80 美元的 LTV (SO.tax)) / COUNT(DISTINCT customer_email)
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2014-05-18
  • 1970-01-01
  • 2013-03-19
  • 2013-01-13
  • 2011-12-18
相关资源
最近更新 更多