我最近一直在潜伏并学习一些 SQL,所以如果这很容易,我很抱歉,我完全误解了。
我试图找出不同用户在他们第一次参加活动后的前 90 天内做了多少“事情”,比如前 90 天内的出租车旅行或信用卡交易。我在 BigQuery 工作。
所以,我有一个看起来像这样的东西:
transaction_id | customer_id | 交易日期 |
---|---|---|
67495549 | 49543345 | 03/07/2014 |
71849572 | 6321113 | 08/12/2016 |
75847266 | 94429299 | 01/03/2017 |
75903310 | 49543345 | 01/03/2017 |
82990678 | 10843 | 06/09/2017 |
85785566 | 384900 | 10/10/2017 |
88019966 | 7444632 | 21/11/2017 |
我目前正在考虑的方式如下:
SELECT
DISTINCT customer_id,
MIN(transaction_date) AS First_transaction,
MIN(transaction_date)+89 AS Last_useful_transaction_date,
COUNT(transaction_id)
FROM
Transactions
/* WHERE
transaction_date BETWEEN MIN(transaction_date) AND MIN(transaction_date)+89 */
GROUP BY
customer_id
现在,没有注释掉的部分,输出看起来像我想要的:每行一个客户 ID,以及有多少交易的计数。我添加了第一个和“最后一个有用”的日期以供参考。当然,事件计数是一个整体计数,不是在前 90 天内,但看起来应该如此。
我被卡住的地方是我只计算日期在第一个交易日期和第一个交易+ 89天日期之间的那部分(这里注释掉)。我收到错误,BETWEEN
和 MIN
不能很好地协同工作(“[11:28] 的 WHERE 子句中不允许使用聚合函数 MIN”)。
所以这就是我目前陷入困境的地方。我也有这样的感觉,当我修复这部分时,我可能会遇到问题,MIN
日期值被认为是绝对的,而不是“该用户的MIN
”?我仍然在为嵌套查询而苦苦挣扎,但我相信解决方案可能就在那个洞的某个地方,对吧?
它甚至有意义吗?
答案 0 :(得分:0)
试试这个:
select
customer_id,
MIN(transaction_date) AS First_transaction,
COUNT(transaction_id)
from (
select *
from transactions
where true
qualify transaction_date <= min(transaction_date) over (partition by customer_id) + 89
)
group by customer_id