获取过去 6 个月内网络上的平均每月活跃客户数。活跃客户是指在过去 12 个月内购买过的客户

问题描述 投票:0回答:1

我正在寻求帮助来解决我正在尝试解决的复杂数据建模问题。想知道是否有任何具有良好 SQL 专业知识的好心人能够帮助我。

问题是:获取过去6个月网站上的平均月活跃客户数。活跃客户是指在过去 12 个月内购买过(event_name='订单收据)的客户。

使用的表具有以下结构:

  • customer_id
    (int):客户的唯一ID
  • session_id
    (int):唯一的会话ID
  • order_id
    (int): 唯一订单 ID
  • Event_id
    (PK - str):网站每次点击的唯一 ID
  • Event_name
    (str):事件描述(可以是“产品页面查看”、“添加到购物车”、“查看购物篮”、“订单收据”)
  • event_date
    (时间戳):用户执行操作的时间(UTC 时间)

到目前为止我能想到的最好的解决方案是这个。但我不确定它是否真的考虑了特定月份的所有客户

WITH monthly_active_customers AS 
(
    SELECT 
        FORMAT_TIMESTAMP('%Y-%m', TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL month_offset MONTH))) AS month,
        COUNT(DISTINCT IFNULL(
            CAST(customer_id AS STRING), 
            CONCAT('GUEST_', CAST(session_id AS STRING))
        )) AS active_customers
    FROM 
        online-retail-dbt.retail.tblEvent
    CROSS JOIN 
        UNNEST(GENERATE_ARRAY(0, 5)) AS month_offset
    WHERE 
        Event_name = 'Order Receipt'
        AND event_date BETWEEN 
            TIMESTAMP(DATE_SUB(DATE_SUB(CURRENT_DATE(), INTERVAL month_offset MONTH), INTERVAL 12 MONTH)) - INTERVAL 10 HOUR
            AND 
            TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL month_offset MONTH)) - INTERVAL 10 HOUR
    GROUP BY 
        month
    ORDER BY 
        month
)
SELECT 
    ROUND(AVG(active_customers), 2) AS avg_monthly_active_customers
FROM 
    monthly_active_customers;
sql google-bigquery data-modeling clickstream
1个回答
0
投票

也许这可以帮助你。将我的 Oracle sintax 调整为您的 sql 方言。代码中的注释
内部 SQL - 要从表中获取月份,计算每月不同的客户并使用 where 子句中的子查询过滤活跃客户
外部 SQL - 获取过去 6 个月期间的平均活跃客户数

SELECT  Round(AVG(cnt_cust_id), 2) as monthly_avg_for_6_months
FROM  ( Select    Trunc(t.event_date, 'mm') as yr_mnth,      -- Trunc() used  to truncate date to the month
                  Count(Distinct t.customer_id) as cnt_cust_id
        From      tbl t 
        Where     t.customer_id IN( Select    Distinct customer_id
                                    From  tbl
                                    Where event_Name = 'Order Receipt' And 
                                          Trunc(event_date) >= Add_Months(Trunc(SYSDATE), -12)
                                   )  
        Group By  Trunc(t.event_date, 'mm')
      )
WHERE   yr_mnth > Add_Months(Trunc(SYSDATE, 'mm'), -6)    -- Add_Months() adds/subtracts months from date
MONTHLY_AVG_FOR_6_MONTHS
1.75

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.