计算日期之间的事件,但日期根据变量“第一个事件”

时间:2021-06-05 08:37:48

标签: sql

我最近一直在潜伏并学习一些 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天日期之间的那部分(这里注释掉)。我收到错误,BETWEENMIN 不能很好地协同工作(“[11:28] 的 WHERE 子句中不允许使用聚合函数 MIN”)。

所以这就是我目前陷入困境的地方。我也有这样的感觉,当我修复这部分时,我可能会遇到问题,MIN 日期值被认为是绝对的,而不是“该用户的MIN”?我仍然在为嵌套查询而苦苦挣扎,但我相信解决方案可能就在那个洞的某个地方,对吧?

它甚至有意义吗?

1 个答案:

答案 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