2016-01-20 57 views
0

我对课题组会议出席,其中一排是出席在给定日期/时间会话一个用户的数据。团体提供可以具有一定数量的会话,例如, 10,他们通常在同一时间(StartTime)和星期几(DayOfWeek)提供。MSSQL:从会议考勤数据找出同类群组

我想,以确定该组产品的开始和结束日期,即第一届和给定队列的最后一次会议。队列将从参加小组会议的相同用户列表中确定。

Table: ---GroupSessions--- GroupSessionDate UserID Topic StartTime DayOfWeek ArrivalStatus Jan-08-2015 1 A 11:30:00 AM Thursday Arrived Jan-08-2015 2 A 11:30:00 AM Thursday Arrived Jan-08-2015 3 A 11:30:00 AM Thursday Arrived Jan-08-2015 4 A 11:30:00 AM Thursday Arrived Jan-15-2015 1 A 11:30:00 AM Thursday Arrived Jan-15-2015 2 A 11:30:00 AM Thursday Arrived Jan-15-2015 3 A 11:30:00 AM Thursday Arrived Jan-15-2015 4 A 11:30:00 AM Thursday Arrived Jan-22-2015 1 A 11:30:00 AM Thursday Arrived Jan-22-2015 2 A 11:30:00 AM Thursday Arrived Jan-22-2015 3 A 11:30:00 AM Thursday Arrived Jan-22-2015 4 A 11:30:00 AM Thursday Missed May-15-2015 5 A 09:00:00 AM Friday Arrived May-15-2015 2 A 09:00:00 AM Friday Arrived May-15-2015 6 A 09:00:00 AM Friday Arrived May-22-2015 5 A 09:00:00 AM Friday Arrived May-22-2015 6 A 09:00:00 AM Friday Arrived May-22-2015 2 A 09:00:00 AM Friday Missed May-29-2015 5 A 09:00:00 AM Friday Arrived May-29-2015 6 A 09:00:00 AM Friday Arrived May-29-2015 2 A 09:00:00 AM Friday Missed

在上面的例子中,有2组群。队列1将由用户1,2,3和4组成,几乎所有人都参加了2015年1月8日至2015年1月22日期间的群组发布(主题A)。 2015年1月15日至2015年1月15日会议的相同用户参加了会议,几乎所有人也参加了2015年1月22日的会议。

的第2组(也为话题A)是由用户2,5,6的,与提供日期5月15日至29日,2015年

会话的数目没有提供每设置,因为它可以根据需求而变化,所以我不能将发行日期的会议数量考虑在内。

我看过Oracle/SQL: Split two inter-related lists into independent cohorts 但问题仍未解答。

通常我会在视觉上做了检查,并指定用户的同伙,但我行数以万计,并希望能有一个更有效的方式与SQL做到这一点。我运行MSSQL 2014

我一直在使用OUTER APPLY与自身表试过,但我没有真正得到我想要的结果。

请问您能指点我正确的方向吗?

SQL:

SELECT src.UserID 
    ,src.GroupSessionDate 
    ,src.StartTime 
    ,src.DayofWeek 
    ,src.Topic 
    ,prevsessdata.GroupSessionDate 
    FROM GroupSessions src OUTER APPLY 
    (SELECT TOP 1 * GroupSessions prevsd WHERE src.Topic=prevsd.Topic 
    AND src.UserID=prevsd.UserID AND src.DayOfWeek=prevsd.DayOfWeek 
    AND src.StartTime=prevsd.StartTime 
    AND prevsd.GroupSessionDate<src.GroupSessionDate) prevsessdata 

编辑: 假设可以做出:

  • 会话通常发生间隔1周(例外:节假日)
  • 在相同群组的所有会话会具有相同的主题,在一周的同一天,和相同的开始时间
  • 用户可以停止参加,但他们犯了D IN他们错过了会议上市 - (!对不起,我错过了在原来的问题这个关键的细节)
  • 相同的用户一般会列出组提供的所有会议,虽然用户可以参加多个主题组,所以有可能是用户被列为另一个群组的一部分的情况(这里用户2在1月和5月参加了提供)。但是,这将限制在一个队列中的10或12个用户中。

所需的输出: 每个主题,开始时间,以及陶氏,列出队列开始/结束日期。

谢谢!

+0

你期待什么样的输出?而且,更重要的是,你究竟如何确定什么是或不是一个队列?例如你说2,5,6是一个队列,但是2只在第二批参加了这些小组会话之一。是否有任何可以做出的假设(例如,小组会议将始终是同一主题,同一天,如果他们是同一个“队列”,则每周相同时间)? – ZLK

+0

对不起,我错过了这个。我将编辑帖子。 – user2716667

回答

0

我认为你正在寻找的东西是这样的:通过声明

; WITH T AS (
    SELECT CONVERT(DATE, REPLACE(GroupSessionDate, '-', ' ')) GroupSessionDate, Topic, StartTime, [DayOfWeek] 
     , STUFF((SELECT ', ' + CONVERT(NVARCHAR, UserID) 
      FROM GroupSessions 
      WHERE GroupSessionDate = G.GroupSessionDate 
      AND Topic = G.Topic 
      AND StartTime = G.StartTime 
      AND [DayOfWeek] = G.[DayOfWeek] 
      ORDER BY UserID 
      FOR XML PATH ('')), 1, 2, '') [Cohort] 
    FROM GroupSessions G 
    GROUP BY GroupSessionDate, Topic, StartTime, [DayOfWeek]) 
SELECT Cohort, MIN(GroupSessionDate) SessionStartDate, MAX(GroupSessionDate) SessionEndDate, Topic, StartTime, [DayOfWeek] 
FROM T 
GROUP BY Topic, StartTime, [DayOfWeek], Cohort, DATEDIFF(dd, 0, GroupSessionDate) % 7 
ORDER BY MIN(GroupSessionDate) 

单群。真的,从你看到的问题看,你需要做的就是按主题,starttime,dayofweek和groupsessiondate进行分组,找到每个“队列”,然后再次对它们进行排序,找出每个队列的最小/最大日期。

如果这不会产生正确的结果,那么您可能需要使用其他一些标准来进一步缩小范围。

+0

非常感谢,这正是我期待的结果! 有一个问题,我不熟悉表达式:DATEDIFF(dd,0,GroupSessionDate)%7.它检查DateDiff结果除以7是否返回0? – user2716667

+0

这只是日期的模数(所以它检查实际日期是在同一天)。这可能实际上并不是必需的,因为一周中的几天都记录在您的表格中(在另一个表格中,您可能会使用它来检查一周中的几天),但是确保有人没有进入在某个时间点错误的一天。 – ZLK