2013-03-23 85 views
0

我想製作一個特定的計數器,在連續找到特定的記錄後,該計數器將加1。由特定記錄分隔的GROUP值

time event  revenue counter 

13.37 START  20   1 
13.38 action A  10   1 
13.40 action B  5   1 
13.42  end     1 

14.15 START  20   2 
14.16 action B  5   2 
14.18  end      2 

15.10 START  20   3 
15.12  end      3 

我需要找出每次訪問的總收入(START和END之間的操作)。我想最好的辦法是設置一個這樣的計數器:

所以我可以將事件分組。但如果你有更好的解決方案,我將不勝感激。

+0

您是使用MySql還是SQL Server? MySql允許內聯分配。 – 2013-03-23 23:54:52

+0

即時通訊使用SQL服務器btw – Gorionovic 2013-03-24 00:25:47

+0

請發佈此數據示例的**預期結果**。您是否允許將這樣的計數器作爲附加字段添加到您的表中,或者您是否計劃在SQL代碼中「實時」構建它? – 2013-03-24 00:30:56

回答

0

您可以使用類似於以下查詢:

with StartTimes as 
(
    select time, 
    startRank = row_number() over (order by time) 
    from events 
    where event = 'START' 
) 
select e.*, counter = st.startRank 
from events e 
    outer apply 
    (
    select top 1 st.startRank 
    from StartTimes st 
    where e.time >= st.time 
    order by st.time desc 
) st 

SQL Fiddle with demo

可能需要根據實際數據的特定特徵(如重複次數,缺失事件等)進行更新,但它適用於樣本數據。

+0

謝謝你的回答 – Gorionovic 2013-03-24 01:19:51

0

SQL Server 2012的支持聚集OVER子句,所以如果你是最新的版本,這會給你你想要的計數器:

count(case when eventname='START' then 1 end) over (order by eventtime) 

你也可以使用最新的啓動時間,而不是一個計數器組通​​過,像這樣的:

with t as (
    select 
    *, 
    max(case when eventname='START' then eventtime end) 
    over (order by eventtime) as timeStart 
    from YourTable 
) 
    select 
    timeStart, 
    max(eventtime) as timeEnd, 
    sum(revenue) as totalRevenue 
    from t 
    group by timeStart; 

Here「SA使用模式伊恩張貼他的解決方案SQL小提琴演示。

+0

謝謝,不知道OVER子句。乾杯! – Gorionovic 2013-03-24 01:18:00