2015-04-24 102 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