2015-02-05 31 views
0

好吧,我有2個表。Select Statement複雜的數據轉換

表A是對於給定的客戶交易的列表,看起來像這樣

ClientID Transaction Start  Stop 
1   1   2014-01-01 2014-01-25 

表B是事件的列表,看起來像這樣:

ClientID Event StartE  StopE 
1   1 2014-01-05 2014-01-08 
1   2 2014-01-10 2014-01-12 
1   3 2014-01-14 2014-01-16 

我想「加入「這些表一起得到下表:

ClientID Transaction EFF   ENDS 
1   1   2014-01-01 2014-01-05 
1   1   2014-01-05 2014-01-08 
1   1   2014-01-08 2014-01-10 
1   1   2014-01-10 2014-01-12 
1   1   2014-01-12 2014-01-14 
1   1   2014-01-14 2014-01-16 
1   1   2014-01-16 2014-01-25 

我已經想出了一些解決方案,但它在某些情況下,這是我的代碼失敗的例子。我想嘗試和接近這個新鮮事物。

回答

1

就像這樣,沒有測試,所以不知道它的工作原理。基本上,我將所有日期與適當的事務編號一起合併到一列中,然後按日期排序並添加行號,然後將該結果集合加入自身,以便將每一行與後續行配對。

;WITH ordered AS (
    SELECT ROW_NUMBER OVER (ORDER BY [Date]) AS Row, ClientID, Transaction, [Date] 
    FROM (
     SELECT ClientID, Transaction, StartE AS [Date] 
     FROM B JOIN A ON StartE BETWEEN A.Start AND A.Stop 

     UNION 

     SELECT ClientID, Transaction, StopE AS [Date] 
     FROM B JOIN A ON StopE BETWEEN A.Start AND A.Stop 

     UNION 

     SELECT ClientID, Transaction, Start AS [Date] 
     FROM A 

     UNION 

     SELECT ClientID, Transaction, Start AS [Date] 
     FROM A 
    ) combineddates 
) 
SELECT o1.ClientID, o1.Transaction, o1.[Date] AS Start, o2.[Date] AS Stop 
FROM ordered o1 JOIN ordered o2 ON o2.Row = o1.Row + 1 
+0

這種方法有幫助。但語法不適用於netezza,但你幫我弄明白了,謝謝:) – boomoto 2015-02-06 14:35:57