【问题标题】:SQL Bigquery Counting repeated customers from transaction tableSQL Bigquery从交易表中计算重复客户
【发布时间】:2021-07-13 10:14:20
【问题描述】:

我有一个看起来像这样的事务表。

userid orderDate amount
111 2021-11-01 20
112 2021-09-07 17
111 2021-11-21 17

我想计算本月从我们商店购买的不同客户(用户 ID)有多少在上个月从我们商店购买。例如,在 2020 年 2 月,我们有 20 位客户,在这 20 位客户中,有 7 位也是在 2020 年 1 月的上个月从我们的商店购买的。我想在之前的所有月份都这样做,所以最终得到类似的结果。

year month repeated customers
2020 01 11
2020 02 7
2020 03 9

我已经写了这个,但这仅适用于当前月份。我将如何迭代或重写它以获得如上所示的表格。

WITH CURRENT_PERIOD AS (
SELECT DISTINCT userid
FROM table1
WHERE DATE(orderDate) BETWEEN DATE_TRUNC(CURRENT_DATE(),MONTH) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
),

PREVIOUS_PERIOD AS (
SELECT DISTINCT userid
FROM table1
WHERE DATE(orderDate) BETWEEN DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH),MONTH) AND LAST_DAY(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH))
)

SELECT count(1)
FROM CURRENT_PERIOD RC
WHERE RC.userid IN (SELECT DISTINCT userid FROM PREVIOUS_PERIOD)

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    可以汇总得到每个月的一条记录,使用lag(),然后聚合:

    select yyyymm,
           countif(prev_yyyymm = date_add(yyyymm, interval -1 month)
    from (select userid, date_trunc(order_date, month) as yyyymm,
                 lag(date_trunc(order_date, month)) over (partition by userid order by date_trunc(order_date, month)) as prev_yyyymm
          from table1
          group by 1, 2
         ) t
    group by yyyymm
    order by yyyymm;
    

    【讨论】:

    • 像魅力一样工作!非常感谢!
    • @user16438416 。 . .如果这回答了您的问题,您可以接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多