GROUP值由特定记录分隔

时间:2013-03-23 23:43:30

标签: sql sql-server-2008

我想制作一个特定的计数器,在连续找到特定记录后会加1。

  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之间的操作)。我认为最好的方法是设置一个这样的计数器:

所以我可以分组活动。但如果你有更好的解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分: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

可能需要根据实际数据的特定特征进行更新,例如重复次数,缺少事件等。但它适用于样本数据。

答案 1 :(得分:0)

SQL Server 2012支持聚合的OVER子句,因此如果您在版本上保持最新状态,这将为您提供所需的计数器:

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

您也可以使用最新的START时间而非计数器来分组,如下所示:

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是一个SQL小提琴演示,使用了Ian为他的解决方案发布的架构。