2015-06-21 105 views
0

我一直在用一個查詢,正在驅使我堅果的圈子中運行。左連接多列不需要重複

背景:
我有兩個表,不幸的是,兩個表都有重複的記錄。 (處理活動日誌,如果這樣做的話)。每個表都來自不同的系統,我試圖將數據連接在一起以獲得sudo完整圖片(我意識到我不會獲得完美的視圖,因爲兩個系統之間沒有「事件密鑰」共享;我嘗試匹配元數據的組合)。

以下是我與合作:

Table1 
------------ 
JobID  CustID  Name  ActionDate    IsDuplicate 
12345  11111  Ryan  1/1/2015 01:20:20  False 
12345  11112  Bob  1/1/2015 02:10:20  False 
12345  11111  Ryan  1/1/2015 04:15:35  True 
12346  11113  Jim  1/1/2015 05:10:40  False 
12346  11114  Jeb  1/1/2015 06:10:40  False 
12346  11111  Ryan  1/1/2015 07:10:30  False 

Table2 
------------ 
ResponseID CustID  ActionDate   Browser 
11123  10110  12/1/2014 23:32:15 IE 
12345  11111  1/1/2015 03:20:20  IE 
12345  11112  1/1/2015 05:10:20  Firefox 
12345  11111  1/1/2015 06:15:35  Firefox 
12346  11113  1/1/2015 07:10:40  Chrome 
12346  11114  1/1/2015 08:10:40  Chrome 
12346  11111  1/1/2015 10:10:30  Safari 
12213  11123  2/1/2015 01:10:30  Chrome 

請注意以下幾點:
- 作業ID和ResponseID是一回事
- 作業ID和ResponseID是在網站上的活動指標(人們對事件做出響應)
- 操作日期不匹配(系統2的延遲時間不一致,但延遲時間不會超過3小時)
- 注意表2沒有重複標記
- 表1(〜2,000條記錄)明顯小於表2(約16,000條記錄)
- 註釋Cust 11111在瀏覽器上不斷跳動,在作業12345的不同時間執行兩次相同的操作,並且只在作業中採取一次操作12346

我在尋找:

Result (ideal) 
------------ 
t1.JobID t1.CustID t1.Name t1.ActionDate  t2.Browser 
12345  11111  Ryan  1/1/2015 01:20:20 IE 
12345  11112  Bob  1/1/2015 02:10:20 Firefox 
12345  11111  Ryan  1/1/2015 04:15:35 Firefox 
12346  11113  Jim  1/1/2015 05:10:40 Chrome 
12346  11114  Jeb  1/1/2015 06:10:40 Chrome 
12346  11111  Ryan  1/1/2015 07:10:30 Safari 

請注意,我只是想在表1的記錄相符。由於加入,我得到了大量的重複...這是令人沮喪的。

這裏是我到目前爲止(我可以謙卑可以說,是不是真的關閉):

SELECT 
    t1.JobID, 
    t1.CustID, 
    t1.Name, 
    t1.ActionDate, 
    t2.Browser 
FROM 
    Table1 t1 
LEFT OUTER JOIN 
    Table2 t2 
ON 
    t1.JobID=t2.ResponseID AND 
    t1.CustID=t2.CustID AND 
    DATEPART(dd,t1.ActionDate)=DATEPART(dd,t2.ActionDate) 

回答

0

請嘗試更改日期的連接條件檢查t2.actiondate滿足條件t1.actiondate <= t2.actiondate <= t1.actiondate + 3 hours

SELECT 
    t1.JobID, t1.CustID, t1.Name, t1.ActionDate, t2.Browser 
FROM 
    Table1 t1 
LEFT JOIN Table2 t2 
     ON t1.JobID = t2.ResponseID 
     AND t1.CustID = t2.CustID 
     AND t2.ActionDate >= t1.ActionDate 
     AND t2.ActionDate <= DATEADD(hour, 3, t1.ActionDate) 
ORDER BY t1.JobID , t1.ActionDate; 

使用您的示例數據,此查詢的結果與您所需的結果相匹配。

0

一種方法是順序號使用row_number()和匹配,以及列舉的每個表:

select t1.JobID, t1.CustID, t1.Name, t1.ActionDate, t2.Browser 
from (select t1.*, 
      row_number() over (partition by JobId, CustId order by ActionDate) as seqnum 
     from table t1 
    ) t1 join 
    (select t2.* 
      row_number() over (partition by ResponseId, CustId order by ActionDate) as seqnum 
     from table t2 
    ) t2 
    on t1.JobId = t2.ResponseId and 
     t1.CustId = t2.CustId and 
     t1.seqnum = t2.seqnum; 

這適用於您的樣本數據。但是,如果沒有對每項工作的迴應,那麼對齊可能會失去作用。如果這是一種可能性,那麼日期算術可能是更好的解決方案。