2011-11-22 46 views
0

我一直試圖整個下午試圖實現這一目標,但沒有成功。減去前一行的數據,其中id與上面的行相同

我有一個數據庫與客戶的信息和他們從商店購買產品的日期。它按照我已轉換爲日期格式的批次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 

我曾嘗試加入表本身,而是我的問題是,我最終以同樣的格式加入。然後我用我的加入聲明嘗試返回匹配日期。

希望這是有道理的,任何幫助表示讚賞。我在這裏搜索了所有相關的主題。

+0

什麼數據庫引擎? Oracle SQL服務器? mySQL ...並且customerID只會在表中存在兩次? – xQbert

+0

@xQbert:TSQl = SQL服務器 – SQLMason

+0

SQL服務器,感謝您的迴應Dan –

回答

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 
+0

我打算將它們組合在一起,我有超過1,000個客戶ID,我應該在上面的問題中提出,並表示歉意。有些客戶已經完成了超過200次的購買,所以電子表格變得相當大。 –

+0

我的答案應該可以工作 – SQLMason

+0

感謝丹,看起來像是有效的。感謝您的時間 –

相關問題