2013-03-21 56 views
1

我正在嘗試計算只有一個會話的表中的唯一事件數。我們有一個名爲「會話跟蹤」的表格,用於存儲事件編號,並存儲該會話的以前的狀態和當前狀態。我想計算只有一個會話的事件數量,並且我還希望計算可能有多個會話的事件數量,但前提是以下會話在關閉和結束時開始關閉。基本上不包括在聚合列表中不改變狀態的會話。計算篩選出某個條件的記錄數

例子:

Incident ID Start Status End Status 
1   Open   Closed 
1   Closed  Closed 
2   Open   Closed 
3   Open   Closed 
4   Open   Open 
4   Open   Closed 

我想要得到的前三個事件,因爲事件2和3兩人相依爲命只有1次會議,並希望,因爲它有一個會話數第一事件發生後,它已經關閉,而第二次會議不算。第四起事件不會計算在內,因爲它有多個會議在開放。

這是我使用的聲明,並認爲有些事情可能是關閉...

SELECT Incident, COUNT(Incident) 
FROM Session_Tracking 
WHERE NOT (Prev_Status = 'Closed' AND Current_Status = 'Closed') 
GROUP BY Incident 
HAVING COUNT(Incident) = 1 
+0

當你運行這個查詢時,你會得到什麼結果? – Melanie 2013-03-21 15:56:45

+0

我收到了突發事件和1的列表,但與沒有WHERE子句相比,我遇到了衝突的數字。一個月我得到的數字比WHERE子句的總數少,而下一個我越來越多。這很奇怪,所以我想問問這裏是否會有更好的方法......並且我正在使用Microsoft SQL Server – 2013-03-21 16:02:10

回答

1

假設你正在使用支持窗口功能合理的數據庫,你可以通過只計數的事情做到這一點:

select SUM(case when numInIncident = 1 then 1 else 0 end) as Singletons, 
     SUM(case when ClosedClosed = numInIncident - 1 and numInINcident > 1 then 1 else 0 
      end) as RestClosed 
from (select st.*, 
      COUNT(*) over (partition by incident) as numInIncident, 
      sum(case when startStatus = 'Closed' and endStatus = 'Closed' then 1 else 0 end) over (partition by incident) as ClosedClosed 
     from session_tracking 
    ) st 

內部子查詢計算每個事件的行數,以及開始和結束狀態均爲「關閉」時的行數。外部查詢應用這個邏輯來獲得你想要的數字。