2

ユーザーがアプリケーションにログインしたときに生成されるデータがあります。タイムスタンプ付きのログインとログアウトが含まれていますが、これらは特定の作業キャンペーンに起因するものではありません。これらは、各レコードの私の境界です。

その期間内に、キャンペーンに起因するタスク 1、タスク 2、休憩などの繰り返し可能なアクションがあります。

別のキャンペーンの作業を開始するには、ユーザーはログオフしてからアプリケーションに戻る必要があります。これにより、プロセスが最初からやり直されます。

このフィドルでは、テーブルとサンプルデータをレイアウトし、データを収集する最初の試みを行いましたが、このアプローチでは、ログイン/ログアウトからの開始時間と停止時間が合計されますが、開始を反映するデータが必要ですキャンペーンの時間を止めて、どうしようか迷っています。

http://sqlfiddle.com/#!3/5347c/1

私の結果には以下が含まれる必要があります。

  • 運動
  • オリジネーター
  • 開始 (そのセットのログイン アクションからの時間)
  • 終了 (そのセットのログアウト アクションからの時間)
  • セットのタスク 1 の合計
  • セットのタスク 2 の合計
  • そのセットの最後のタスク

    ══════════════════════════════════════════════════
    Campaign Originator Start End   Task1 Task2 LastAction
    ═══════════════════════════════════════════════════
    Camp1    1000       08:00 09:27 3120  855    Logout   
    Camp2    1000       09:30 10:32 1800  135    Logout   
    Camp1    1000       13:00 0        0         Task1    
    

ログイン時間とログアウト時間を個別の行として取得するために CTE アプローチを試みましたが、次のステップがわからないため、混乱の輪に巻き込まれました。

このデータを使用してこれらの結果を達成する方法について、誰かがアイデアを共有できますか?

4

1 に答える 1

1

これにはおそらくいくつかのリファクタリングが必要です。

;with Sessions as (
    select OriginatorId, State, Duration, ActionLocalTime, Campaign
        -- Get an id that will later be used to find the max row per session. Break ties with logical State order.
        , row_number() over (order by OriginatorId, ActionLocalTime, case State when 'Login' then 10 when 'Logout' then 30 else 20 end, State) as RowNum
        -- Get a Session id for each login
        , (select count(*) from Actions where State = 'Login' and OriginatorID = a.OriginatorID and ActionLocalTime <= a.ActionLocalTime) as Session
    from Actions a
), Campaigns as (
    select OriginatorId, State, Duration, ActionLocalTime, RowNum
        -- Get the Campaign for this session
        , (select max(Campaign) from Sessions where OriginatorID = s.OriginatorID and Session = s.Session) as Campaign
    from Sessions s
)
select Campaign
    , OriginatorID as Originator
    , min(ActionLocalTime) as Start
    , (select ActionLocalTime from Sessions where RowNum = max(c.RowNum) and State = 'Logout') as [End]
    , (select sum(Duration) from Campaigns where OriginatorID = c.OriginatorID and Campaign = c.Campaign and State = 'Task 1') as Task1
    , (select sum(Duration) from Campaigns where OriginatorID = c.OriginatorID and Campaign = c.Campaign and State = 'Task 2') as Task2
    , (select State from Sessions where RowNum = max(c.RowNum)) as LastAction
from Campaigns c
group by OriginatorID, Campaign
order by OriginatorID, Campaign

出力:

Campaign Originator Start                   End                     Task1 Task2 LastAction
-------- ---------- ----------------------- ----------------------- ----- ----- ----------
Camp1    1000       2013-05-06 08:00:00.000 2013-05-06 09:27:00.000 3120  855   Logout
Camp2    1000       2013-05-06 09:30:00.000 2013-05-06 10:32:00.000 1800  135   Logout

これは、少し余分なデータを含むSQL Fiddleです。

于 2013-05-06T21:12:45.530 に答える