【问题标题】:Calculate prior ties individuals have had with other team members prior to current team计算在当前团队之前个人与其他团队成员的先前联系
【发布时间】:2018-05-01 18:29:12
【问题描述】:

我想计算在当前团队成立之前每个成员与其他团队成员的先前联系数。

我有下表

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

我想得到下表

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

以团队 1 为例: 用户 100 在团队 3 中与用户 101 合作过一次,在团队 3 中与用户 102 合作过一次,因此 = 1+1=2 用户 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]

【问题讨论】:

  • 具有挑战性的问题。这个链接应该让你开始......我只是没有更多的时间来处理它。关注结果,而不是代码。一旦你理解了这些,你就可以从 cte 过滤器中计算出你的下一段代码。 rextester.com/OSS61370
  • 谢谢@scsimon。我用你的代码来生成我的答案。
  • 非常感谢@scsimon

标签: sql sql-server-2008 select count


【解决方案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

(然后你可以分组并计数得到最终结果)

【讨论】:

  • 非常感谢@Remi。它给出了正确的答案。感谢您的帮助:)
  • 我编辑了我的答案:!= 条件不是必需的。
【解决方案2】:

您可以通过自加入获得所有用户协作:

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;

【讨论】:

  • 非常感谢戈登。感谢您的快速帮助。
  • c 将拥有每对用户两次,以及一对相同的用户。您不需要诸如 s.userid
  • @Rémi 。 . .正如问题所述,它们似乎应该被计算两次(“计算每个成员在当前团队成立之前与其他团队成员的先前联系数”)。诚然,样本数据暗示了您的解释。附加条件很容易添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多