我正在寻求帮助来解决我正在尝试解决的复杂数据建模问题。想知道是否有任何具有良好 SQL 专业知识的好心人能够帮助我。
问题是:获取过去6个月网站上的平均月活跃客户数。活跃客户是指在过去 12 个月内购买过(event_name='订单收据)的客户。
使用的表具有以下结构:
customer_id
(int):客户的唯一IDsession_id
(int):唯一的会话IDorder_id
(int): 唯一订单 ID Event_id
(PK - str):网站每次点击的唯一 IDEvent_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;
也许这可以帮助你。将我的 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 |