BigQuery - 如果客户 ID 匹配,则与上一行的时间差

BigQuery - Time difference from previous row if customer ID matches

我有一个订单 table 大致如下所示

consumerID || TransactionDate || Revenue
1          || 2015-01-01      || 55
1          || 2015-02-01      || 65
2          || 2015-01-01      || 10
3          || 2015-03-01      || 20
4          || 2015-01-01      || 25
4          || 2015-01-01      || 45
4          || 2015-03-01      || 55

我想添加一个列来计算客户下下一个订单所花费的时间(以月为单位),这样数据看起来像

consumerID || TransactionDate || Revenue || OrderCount || TimeInMonths
1          || 2015-01-01      || 55      || 1          || null
1          || 2015-02-01      || 65      || 2          || 1
2          || 2015-01-01      || 10      || 1          || null
3          || 2015-03-01      || 20      || 1          || null
4          || 2015-01-01      || 25      || 1          || null
4          || 2015-01-01      || 45      || 2          || 0
4          || 2015-03-01      || 55      || 3          || 2

我已经想出如何使用以下方法运行计算出客户的订单数量

ROW_NUMBER() OVER (PARTITION BY o.ConsumerID ORDER BY TransactionDate ASC) OrderNumber,

我想做类似的事情,但计算出月份差异,我很难过。

我想要的是

如果是第一个订单,或者最早见到客户的日期,则为空。 如果订单号 2 计算与 1 的差值,如果 3 号从 2 号计算,依此类推。

如果方便的话,我可以确保数据按 consumerId 和交易日期排序

SELECT ConsumerID, TransactionDate, Revenue, OrderCount,
  DATEDIFF(TransactionDate, prevTransactionDate) AS TimeInDays,
  INTEGER(DATEDIFF(TransactionDate, prevTransactionDate)/30) AS TimeInMonths
FROM (
  SELECT ConsumerID, TransactionDate, Revenue, 
    ROW_NUMBER() OVER(PARTITION BY ConsumerID 
        ORDER BY TransactionDate ASC) OrderCount,
    LAG(TransactionDate) OVER(PARTITION BY ConsumerID 
        ORDER BY TransactionDate ASC) prevTransactionDate
  FROM YourTable 
) ORDER BY ConsumerID, TransactionDate 

天数的计算是显而易见的。以月为单位的计算要求您设置如何根据天数差异计算它的业务逻辑。以上是应用的示例规则。