2016-08-04 8 views
0

SharePointの監査データがあるテーブルのSQL Serverでのページの直帰率を計算しようとしています。バウンス率の計算SQL Server 2008

ItemId UserId DocLocation Occurred 
1  1  Home.aspx 2016-08-02 13:39:41 
1  2  Home.aspx 2016-08-02 13:40:07 
2  1  Other.aspx 2016-08-02 13:40:16 
3  1  Items.aspx 2016-08-02 13:40:17 
2  2  Other.aspx 2016-08-02 13:40:11 

ItemIdユーザがページになると、DocLocationページの位置とOccurredページのIDです。

バウンス率を計算するには、合計訪問回数の間にバウンス数を分割する必要があります。

ユーザーが5秒以内にページを離れるとバウンスが発生します。

これは、そのテーブルの結果のようになります。

ItemId Bounces Visits BounceRate(Bounces/Visits) 
1  1  2  0.5 
2  1  2  0.5 
3  0  1  0 

は、私は、ユーザーが別のページへの訪問をするまで、ユーザーがチェックを行っているため、どのくらいのパスを計算するバウンスをカウントします。その時間が5秒未満の場合、バウンスとしてカウントされます。

各ページの直帰率を表示するためにクエリを実行するストアドプロシージャを作成していますが、これは機能しません。

SELECT 
    SUM(CASE 
      WHEN (DATEDIFF(second, @Occurred, 
           (SELECT TOP 1 a.Occurred 
            FROM [AuditPages] a 
            WHERE a.UserId = @userId 
            AND a.Occurred > @occurred 
            ORDER BY a.Occurred ASC))) < 30 
       THEN 1.0 
       ELSE 0.0 
     END)/COUNT(@itemId) 

どのように私はこの直帰率を計算できますか?

すべての回答ありがとうございます。

+1

期待いくつかのサンプルデータとショーを提供してください結果 – TheGameiswar

+0

質問は何ですか? –

+0

「SQL Server上のページの直帰率」とは何ですか? –

答えて

0

このタイプの順序付き問題にはrow_numberを使用するのが好きです。以下のクエリは、望ましい結果を示します。私はCTEでのパフォーマンスが、より大きなテーブルで問題になることがあり、一時テーブルに変換する必要があるかもしれないことがわかります。将来4.5秒などを使用する可能性がある場合は、ミリ秒を使用することを検討することもできます。

declare @bounce_seconds int = 5; 

with audit_cte as (

    select *, ROW_NUMBER() over (partition by UserId order by Occurred) row_num 
    from AuditPages 
    --order by UserId,row_num 
) 
select  a.ItemId, sum(a.bounce) Bounces, count(1) Visits, sum(a.bounce)/convert(float, count(1)) BounceRate 
from  (
      select  a1.ItemId, datediff(s,a1.Occurred, a2.Occurred) elapsed, case when datediff(s,a1.Occurred, a2.Occurred) < @bounce_seconds then 1 else 0 end bounce 
      from  audit_cte a1 
      left join audit_cte a2 
         on a2.UserId = a1.UserId 
         and a2.row_num = a1.row_num + 1 
      --order by a1.UserId, a1.row_num 
      ) a 
group by a.ItemId 
order by a.ItemId; 
+0

ありがとう、これは動作します! – Calde8

0
SELECT ItemId,COUNT(1) VISITS,SUM(BOUNCE_IND) BOUNCE, cast(SUM(BOUNCE_IND) as decimal(5,2))/cast(COUNT(1) as decimal(5,2)) BOUNCE_RATE 
FROM (
    Select 
     UserID, 
     ItemID, 
     DocLocation, 
     Occurred as Entry_time, 
     Lead(Occurred,1) Over (Partition by Userid order by Occurred) Exit_time, 
     CASE WHEN DATEDIFF(ss,Occurred,Lead(Occurred,1) Over (Partition by Userid order by Occurred)) <= 5 THEN 1 ELSE 0 END BOUNCE_IND 
    FROM Web_Data_Sample 
) TBL GROUP BY ItemId