2017-11-17 232 views
2

我想计算每个成员在组建团队之前与其他团队成员之前的关系数量。计算个人之前与其他团队成员在当前团队之前的关系

我有以下表

TeamId \t UserId \t Date 
 
1 \t  100 \t 2/1/2017 
 
1 \t  101 \t 2/1/2017 
 
1 \t  102 \t 2/1/2017 
 
2 \t  100 \t 2//1/2016 
 
2 \t  105 2//1/2016 
 
3 \t  100 \t 2//1/2015 
 
3 \t  101 \t 2//1/2015 
 
3 \t  102 \t 2//1/2015 
 
3 \t  105 \t 2//1/2015 
 
3 \t  106 \t 2//1/2015 
 
4 \t  101 1/3/2015 
 
4 \t  102 \t 1/3/2015 
 
4 \t  105 1/3/2015 
 
4 \t  106 \t 1/3/2015

我想下表

TeamId \t number of previous collaborations 
 
1  \t 4 
 
2 \t   1 
 
3  \t 6 
 
4 \t   0

例如FO得到用户100与用户101曾经在队伍3中合作过,而用户102曾经在队伍3中合作过,因此用户101已经与用户102合作两次(一次在队伍3中,一次在队伍4中) = 1 + 1 = 2

所以以前的合作为这支球队的数量为4

我不知道怎么写的代码。任何帮助表示赞赏

SELECT [TeamId], 
 
COUNT(SELECT [Date] FROM [submissions] s1 
 
     WHERE s.[UserId] = [submissions].[UserId] 
 
     AND [Date]< [submissions].[Date] 
 
     ORDER BY [DateSubmitted] DESC) as Num_Collaborations 
 
    ) 
 
FROM [submissions]

+1

具有挑战性的问题。这个链接应该让你开始...我只是没有更多的时间来处理它。关注结果,而不是代码。一旦你理解了这些,你就可以从cte过滤出你的下一个代码。 http://rextester.com/OSS61370 – scsimon

+0

谢谢@scsimon。我用你的代码来产生我的答案。 –

+0

非常感谢@scsimon – user4172070

回答

1

这是一个具有挑战性的问题。你必须包括在查询相同的表4次:

select t1.TeamId, t1.UserId, t2.TeamId as OtherTeam, t3.UserId as Collaborator 
from @table t1, @table t2, @table t3, @table t4 
where t1.UserId = t2.UserId and 
     t2.TheDate < t1.TheDate and 
     t3.TeamId = t2.TeamId and 
     t4.TeamId = t1.TeamId and 
     t4.UserId = t3.UserId and 
     t4.UserId < t1.UserId 

http://rextester.com/LHZS40204

(那么你可以通过组和计数得到最终的结果)

+0

非常感谢你@Remi。它给出了正确的答案。我感谢你的帮助:) – user4172070

+0

我编辑了我的答案:!=条件是没有必要的。 –

1

你可以得到一个自加入所有用户的合作:

select s.userid, s2.userid as userid2, s.date, 
     row_number() over (order by (select null)) as c_id 
from submissions s join 
    submissions s2 
    on s2.teamid = s.teamid; 

让我们用这个作为一个子查询来回答你的问题。这个想法是将协作与提交相匹配 - 限制了两个用户在后面的日期在同一个团队。然后,您可以汇总:

with c as (
     select s.userid, s2.userid as userid2, s.date, 
      row_number() over (order by (select null)) as c_id 
     from submissions s join 
      submissions s2 
      on s2.teamid = s.teamid 
    ) 
select s1.teamid, count(distinct c_id) as num_previous_collaborations 
from c c join 
    submissions s1 
    on s1.userid = c.userid and 
     s1.date > c.date join -- they are later on a team 
    submissions s2 
    on s2.userid = c.userid2 and 
     s2.teamid = s1.teamid 
group by s1.teami; 
+0

非常感谢Gorden。感谢您的快速帮助。 – user4172070

+0

c将使每一对用户有两次相同的用户。你不需要像s.userid

+0

@Rémi。 。 。正如问题所述,似乎它们应该被计算两次(“计算每个成员在组建现有团队之前与其他团队成员之间的先前关系的数量”)。无可否认,样本数据表明您的解释。附加条件很容易添加。 –