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
天数的计算是显而易见的。以月为单位的计算要求您设置如何根据天数差异计算它的业务逻辑。以上是应用的示例规则。
我有一个订单 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
天数的计算是显而易见的。以月为单位的计算要求您设置如何根据天数差异计算它的业务逻辑。以上是应用的示例规则。