BigQuery - 如果客户ID与

时间:2016-03-07 21:56:59

标签: google-bigquery timedelta

我有一个看起来大致相同的订单表

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计算与第一个的差异,如果第三个计算从第二个开始计算,依此类推几个月。

如果它变得容易,我可以确保数据按consumerId和交易日期

排序

1 个答案:

答案 0 :(得分:1)

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 

天数计算是显而易见的。以月为单位的计算要求您设置如何从差异以天计算它的业务逻辑。以上是适用的样本规则。