【问题标题】:Retrieve Customers with a Monthly Order Frequency greater than 4检索每月订单频率大于 4 的客户
【发布时间】:2022-07-11 11:00:46
【问题描述】:

我正在尝试优化以下查询,以帮助获取所有过去三个月内在过去三个月内每月订单频率为 +4 的客户。

Customer ID Feb Mar Apr
0001 4 5 6
0002 3 2 4
0003 4 2 3

在上表中,客户 ID 为 0001 的客户只应被选中,因为他在一个月内始终有 4 个或更多订单。

下面是我写的一个查询,它吸引了过去 90 天内平均购买频率为 4 次的所有客户,但不考虑过去三个月有 4 次或更多的一致购买次数。

查询:

SELECT distinct lines.customer_id Customer_ID, (COUNT(lines.order_id)/90) PurchaseFrequency
from fct_customer_order_lines lines
LEFT JOIN product_table product
ON lines.entity_id= product.entity_id
AND lines.vendor_id= product.vendor_id
WHERE LOWER(product.country_code)= "IN"
AND lines.date >= DATE_SUB(CURRENT_DATE() , INTERVAL 90 DAY )
AND lines.date < CURRENT_DATE()
GROUP BY Customer_ID
HAVING PurchaseFrequency >=4;

我尝试使用窗口函数,但不确定是否需要在这种情况下使用。

【问题讨论】:

标签: sql google-bigquery frequency orders


【解决方案1】:

我会计算每个月的订单,而不是计算平均值,然后检索过去三个月中总和大于 4 的订单。

另外,我认为您应该使用“month(CURRENT_DATE()) - 3”来选择间隔,而不是使用 90 天的窗口。当然,如果需要,您应该处理 current_date 为 jan-feb-mar 的情况,在这种情况下返回上一年的 oct-nov-dec。

我不熟悉 Google BigQuery,因此无法编写您的查询,但希望对您有所帮助。

【讨论】:

  • 谢谢!我一直在研究它,并在 Big Query 中使用 WITH 运算符找到了正确的解决方案。我将在此处发布查询以供将来参考!
【解决方案2】:

所以我找到了使用 WITH 运算符的解决方案,如下所示:

WITH filtered_orders AS (
   select
  distinct customer_id ID,
  extract(MONTH from date) Order_Month,
  count(order_id) CountofOrders
  from customer_order_lines` lines
  where EXTRACT(YEAR FROM date) = 2022 AND EXTRACT(MONTH FROM date) IN (2,3,4)
  group by ID, Order_Month
  having CountofOrders>=4)
select distinct ID
from filtered_orders 
group by ID
having count(Order_Month) =3;

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    一个选项可以首先按月计算订单,然后过滤在所有月份都超过您的阈值的购买的用户:

    WITH ORDERS_BY_MONTH AS (
        SELECT 
            DATE_TRUNC(lines.date, MONTH) PurchaseMonth,
            lines.customer_id Customer_ID, 
            COUNT(lines.order_id) PurchaseFrequency
        FROM fct_customer_order_lines lines
        LEFT JOIN product_table product
            ON lines.entity_id= product.entity_id
            AND lines.vendor_id= product.vendor_id
        WHERE LOWER(product.country_code)= "IN"
            AND lines.date >= DATE_SUB(CURRENT_DATE() , INTERVAL 90 DAY )
            AND lines.date < CURRENT_DATE()
        GROUP BY PurchaseMonth, Customer_ID
    )
    SELECT 
        Customer_ID,
        AVG(PurchaseFrequency) AvgPurchaseFrequency
    FROM ORDERS_BY_MONTH
    GROUP BY Customer_ID
    HAVING COUNT(1) = COUNTIF(PurchaseFrequency >= 4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 2018-08-26
      • 2013-04-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多