代码之家  ›  专栏  ›  技术社区  ›  324

我怎样才能找到过去90天内完成交易的客户百分比?

  •  0
  • 324  · 技术社区  · 5 年前

    我正试图找到 百分比

    我用的是亚马逊红移。

    我试着写两个独立的查询,但是如果可能的话,我想合并它们。

    /*
    * Numerator (counting customers with purchases within 90 days of becoming members)
    */
    SELECT 
        c.customer_id, 
        c.member_start
    FROM
         (SELECT * FROM before_2012_data
          UNION ALL 
          SELECT  * FROM after_2012_data
         ) t
         LEFT JOIN customer_information c
         ON c.customer_id = t.customer_id
    WHERE DATEDIFF(day, c.member_start, t.purchase_data) between 0 and 90 
    GROUP BY  member_start, c.customer_id
    ORDER BY member_start
    
    /*
    * Denominator (counting customers both with and without purchases within 90 days of becoming members)
    */
    SELECT 
      c.customer_id, 
      c.member_start
    FROM
         (SELECT * FROM before_2012_data
          UNION ALL 
          SELECT  * FROM after_2012_data
         ) t
         LEFT JOIN customer_information c
         ON c.customer_id = t.customer_id
    GROUP BY  member_start, c.customer_id
    ORDER BY member_start
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Tajinder    5 年前

    希望我能正确地理解你的问题。你可以检查下面的查询。

    SELECT 
        count(case when DATEDIFF(day, c.member_start, t.purchase_data) between 0 and 90  then t.customer_id end) / NULLIF(count(t.customer_id),0)
    FROM
         (SELECT * FROM before_2012_data
          UNION ALL 
          SELECT  * FROM after_2012_data
         ) t
         LEFT JOIN customer_information c
         ON c.customer_id = t.customer_id;
    
        2
  •  0
  •   Tim Biegeleisen    5 年前

    可以对单个查询使用条件聚合:

    SELECT
        c.customer_id,
        c.member_start,
        100.0 * COUNT(CASE WHEN DATEDIFF(day, c.member_start, t.purchase_data)
                                BETWEEN 0 AND 90 THEN 1 END) / COUNT(*) AS percentage
    FROM
    (
        SELECT * FROM before_2012_data
        UNION ALL
        SELECT * FROM after_2012_data
    ) t
    LEFT JOIN customer_information c
        ON c.customer_id = t.customer_id
    GROUP BY
        c.customer_id,
        c.member_start
    ORDER BY
        c.member_start;