减去前一行数据,其中id与上面的行相同

时间:2011-11-22 18:57:10

标签: tsql row subtraction

我整个下午都在努力尝试实现这一目标,但没有成功。

我有一个数据库,其中包含客户信息以及他们从商店购买产品的日期。它按批次ID分组,我已将其转换为日期格式。

所以在我的表格中我现在有:

CustomerID|Date
1234      |2011-10-18
1234      |2011-10-22
1235      |2011-11-16
1235      |2011-11-17

我想要达到的目的是查看最近一次购买和上一次购买之间的天数等等。

例如:

CustomerID|Date       |Outcome
1234      |2011-10-18 |
1234      |2011-10-22 | 4
1235      |2011-11-16 |
1235      |2011-11-17 | 1

我已尝试将表格加入到自身,但我遇到的问题是我最终加入了相同的格式。然后我尝试使用我的join语句返回它所做的<>匹配日期。

希望这是有道理的,任何帮助表示赞赏。我在这里搜索了所有相关主题。

1 个答案:

答案 0 :(得分:2)

会有多组CustomerID吗?或者只是总是聚在一起?

DECLARE @myTable TABLE
(
    CustomerID INT,
    Date DATETIME
)

INSERT INTO @myTable
SELECT 1234, '2011-10-14' UNION ALL
SELECT 1234, '2011-10-18' UNION ALL
SELECT 1234, '2011-10-22' UNION ALL
SELECT 1234, '2011-10-26' UNION ALL
SELECT 1235, '2011-11-16' UNION ALL
SELECT 1235, '2011-11-17' UNION ALL 
SELECT 1235, '2011-11-18' UNION ALL
SELECT 1235, '2011-11-19'

SELECT  CustomerID, 
        MIN(date), 
        MAX(date), 
        DATEDIFF(day,MIN(date),MAX(date)) Outcome
FROM @myTable 
GROUP BY CustomerID

SELECT  a.CustomerID, 
        a.[Date], 
        ISNULL(DATEDIFF(DAY, b.[Date], a.[Date]),0) Outcome
FROM 
(
    SELECT  ROW_NUMBER() OVER(PARTITION BY [CustomerID] ORDER BY date) Row,
            CustomerID,
            Date
    FROM @myTable 
) A
LEFT JOIN 
(
    SELECT  ROW_NUMBER() OVER(PARTITION BY [CustomerID] ORDER BY date) Row,
            CustomerID,
            Date
    FROM @myTable 
) B ON a.CustomerID = b.CustomerID AND A.Row = B.Row + 1