0

特定のレコードが連続して見つかった後に 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 の間のアクション) の総収益を調べる必要があります。私は、次のようなカウンターを設定するのが最善の方法だと考えていました。

イベントをグループ化できました しかし、より良い解決策があれば、私は感謝します。

4

2 に答える 2

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

demo を使用した SQL Fiddle

重複時間、イベントの欠落など、実際のデータの特定の特性に基づいて更新する必要がある場合があります。ただし、サンプル データでは機能します。

于 2013-03-24T01:01:41.483 に答える
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;

以下は、Ian がソリューション用に投稿したスキーマを使用した SQL Fiddle デモです。

于 2013-03-24T01:04:00.663 に答える