2015-04-24 73 views
2

我试图创建从我们的数据中的现有记录挖掘聚合的子记录。我有一个列出记录的表格,其中列出了与每个记录上的行为相关的一对多关系。 记录表看起来像这样:使多个子组聚合

Key OpenDate LastUpdate 
aa 1/1/2015 1/14/2015 
bb 1/3/2015 1/15/2015 

行动表看起来像这样:

Key Date  Action 
    aa 1/1/2015 Working 
    aa 1/4/2015 Escalated 
    aa 1/5/2015 Done 
    aa 1/6/2015 Working 
    aa 1/7/2015 Done 
    aa 1/13/2015 Done 
    aa 1/14/2015 Working 
    bb 1/3/2015 Working 
    bb 1/4/2015 Working 
    bb 1/5/2015 Escalated 
    bb 1/6/2015 Working 
    bb 1/7/2015 Done 
    bb 1/13/2015 Working 
    bb 1/15/2015 Done 

我希望能够创建一个行中的每个记录被“做”一次注意到开局和该周期的结束,并计算该范围内的一些项目:

Key SubID DateBegin DateEnd #Actions #Escalations 
aa 1  1/1/2015 1/5/2015 3  1 
aa 2  1/6/2015 1/7/2015 2  0 
aa 3  1/13/2015 1/13/2015 1  0 
aa 4  1/14/2015 null  1  0 
bb 1  1/3/2015 1/7/2015 5  1 
bb 2  1/13/2015 1/15/2015 2  0 

基本上,逻辑是一个子记录结束时的动作值=“完成”,和一个新的子记录初学者ns的任何后续行动(也是第一个行动)。

我看到一个解决方案只适用于一个记录的数据here,但不止一个给我的问题。 我与SQL Server 2008工作

更新 - 我有多个记录返回,但最新数据似乎不正确 - 不知道它变得什么是应该到:

SELECT Key, Cycles.CYCLE_BEGIN_DATE, Cycles.CYCLE_END_DATE, Cycles.NUM_ACTIONS_IN_CYCLE 
FROM Records 
FULL OUTER JOIN 
    (select e.Key, min(Date) as CYCLE_BEGIN_DATE, 
      max(case when Action = 'Done') then Date end) as CYCLE_END_DATE, 
      count(*) as NUM_ACTIONS_IN_CYCLE 
    from (select Key, Action, rowID = ROW_NUMBER() OVER (PARTITION BY Key ORDER BY Date asc), Date 
    from Actions 
    ) e 
    outer apply 
    (select count(*) as grp 
     from (SELECT Key, rowID = ROW_NUMBER() OVER (PARTITION BY Reason_Key ORDER BY Date asc), Date, Action 
    FROM Actions 
    ) e2 
    where e2.Date < e.Date and e2.Action = 'Done' and e.Reason_Key = e2.Reason_Key 
    ) e2 
    group by e.Reason_Key, e2.grp 
) CYCLES 
on Records.Key = Cycles.Key 
+0

为什么您的上一个问题显示索引列,而这个索引列不在您的操作表中?此表是从那以后更新的吗? – FutbolFan

+0

@ Rookie13 - 我认为这将有助于沟通需求,但没有用 - 我需要做的事情的现实更好地体现在这里。 – csupak

回答

1

我觉得基本上在前面的问题中也持有同样的想法。您想在完成任何记录之前严格计算完成记录的数量。这给你一个组标识符,然后可以用于聚合。

在SQL Server 2012+中,您将使用累积和功能。在早期版本中,您可以使用相关的子查询或外部应用来执行相同的操作。

该版本以多种方式修改您的上述内容。特别是,它简化了定义grp的逻辑。我不太容易看到row_number()如何适合查询。我理解逻辑 - 列举已完成的操作并将其用于聚合。但是,在组中的所有行上获取这个值是非常重要的。

SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE 
FROM Records r LEFT OUTER JOIN 
    (select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE, 
      max(case when Action = 'Done') then Date end) as CYCLE_END_DATE, 
      count(*) as NUM_ACTIONS_IN_CYCLE 
     from actions a outer apply 
      (select count(*) as grp 
      from actions a2 
      where a2.key = a.key and a2.date < a.date and a2.action = 'Done' 
      ) a2 
    group by a.key, a2.grp 
    ) a 
    on r.key = a.key; 
+0

很好,是的,我不知道为什么我还有row_no在那里。我需要调整你的'关键'列在一个。我还需要将a.key添加到组中,以便它可以提供正确的结果。但是这样做,它运行得非常快 - 非常高兴,谢谢 – csupak