我需要分析客户付款历史记录,以根据两次购买之间间隔的时间来确定他们是否可以被视为“新”,“当前”,“失效”或“严重失效”。
我已经找到了一种方法(如下),该方法似乎可以通过自动加入一个对每个客户都有付款计数的CTE,然后计算每笔交易之间的月份差来实现。
但是(使用SQL Server 2012)是否有更优雅的方法来实现这一目标?
WITH CTE
AS (
SELECT [customerID]
, [transaction_date]
, [payment_count]
FROM [Financial])
SELECT [cur].[customerID]
, CASE
WHEN ABS(DATEDIFF([mm], [cur].[transaction_date], [prv].[transaction_date])) IS NULL
THEN 'New'
WHEN ABS(DATEDIFF([mm], [cur].[transaction_date], [prv].[transaction_date])) BETWEEN 0 AND 24
THEN 'Current'
WHEN ABS(DATEDIFF([mm], [cur].[transaction_date], [prv].[transaction_date])) BETWEEN 24 AND 36
THEN 'Lapsed'
WHEN ABS(DATEDIFF([mm], [cur].[transaction_date], [prv].[transaction_date])) > 36
THEN 'DeepLapsed'
END AS [Customer_Status_at_Time_Of_Transaction]
FROM [CTE] AS [cur]
LEFT JOIN [CTE] AS [prv] ON [cur].[customerID] = [prv].[customerID]
AND [cur].[payment_count] - 1 = [prv].[payment_count]
ORDER BY [customerID];
答案 0 :(得分:2)
在使用SQL Server 2012时,您可以使用windowing function LAG()
进行救援:
尝试这样的事情:
SELECT [customerID]
, [transaction_date]
, [payment_count]
, LAG([transaction_date]) OVER(PARTITION BY customerID ORDER BY transaction_date DESC) AS Last_transaction_date
--you can use this as parameter too
, DATEDIFF([mm], LAG([transaction_date]) OVER(PARTITION BY customerID ORDER BY transaction_date DESC), [transaction_date]) AS DifferenceInMonths
FROM [Financial]