我想制作一个特定的计数器,在连续找到特定记录后会加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之间的操作)。我认为最好的方法是设置一个这样的计数器:
所以我可以分组活动。但如果你有更好的解决方案,我将不胜感激。
答案 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
可能需要根据实际数据的特定特征进行更新,例如重复次数,缺少事件等。但它适用于样本数据。
答案 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为他的解决方案发布的架构。