2015-06-21 102 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; 

这适用于您的样本数据。但是,如果没有对每项工作的回应,那么对齐可能会失去作用。如果这是一种可能性,那么日期算术可能是更好的解决方案。