我有一个看起来大致相同的订单表
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和交易日期
排序答案 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
天数计算是显而易见的。以月为单位的计算要求您设置如何从差异以天计算它的业务逻辑。以上是适用的样本规则。