TSQL-如何分析上一行以确定两次付款之间的间隔时间

时间:2018-06-20 09:43:32

标签: sql-server tsql sql-server-2012

我需要分析客户付款历史记录,以根据两次购买之间间隔的时间来确定他们是否可以被视为“新”,“当前”,“失效”或“严重失效”。

我已经找到了一种方法(如下),该方法似乎可以通过自动加入一个对每个客户都有付款计数的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];

1 个答案:

答案 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]