2017-03-04 2 views
0

まで、私は効果的にログファイルであるテーブルを持っている....PostgreSQLの - ログデータを集約 - 最小/最大時間別のセッション

id timestamp user job  action 
-------------------------------------------- 
1  7:00 bob  22  did x 
2  7:15 bob  22  did q 
3  7:30 joe  22  did z 
4  8:00 bob  22  did y 
5  8:10 bob  56  did x 
6  8:11 joe  22  did a 
7  8:12 bob  56  did e 
8  8:15 joe  45  did u 
9  8:24 bob  22  BACK to do w 
10  8:32 bob  22  did p 
11  8:45 joe  45  did n 
12  8:47 joe  56  fixed bobs z 

...等...

私は各ユーザーが各自の仕事に費やした時間を集計しようとしました。ユーザーがジョブを変更したときに

仕事で時間が第1の(ユーザー/仕事)で始まり、その後、停止します。

  • ボブは8時10分に変更 - 彼は8に7時から仕事22を働きました:00
  • は、その後、彼は午前8時24分から午前8時32分、私はスタート/ストップを引き出すことができますどのよう

に戻って仕事22に入った8時12

  • に8時10分からのジョブ56を働きました各ユーザーの時間? 目的は、間隔を決定し、各ジョブで費やされた合計時間を集計することです。ユーザーとジョブによって合計することができます。

    私はこの作成できるようにくすぐられます:私は、ループやクエリでそれを行うためのスクリプトを書くことができます...しかし、それはSQLする必要がありますように、これは思わ

    start stop job  user 
    ----------------------------- 
    7:00 8:00 22  bob 
    7:30 8:11 22  joe 
    8:10 8:12 56  bob 
    8:15 8:45 45  joe 
    8:24 8:32 22  bob 
    

    を - それが私の微々たる超えですSQLスキル - Googleの助けを借りても、自分自身が混乱していることがわかりました!

    ありがとうございます!

  • +0

    はどのように文字列として、時間を保存しますか? – McNets

    答えて

    2

    の指示のためのアイデアですsubstract

    declare ini_time time; 
    declare _id int; 
    select id,max(timestamp) from logs where user = new.user 
        into _id,ini_time; 
    set ini_time = new.timestamp-ini_time; 
    update logs set during_time = ini_time where id=_id; 
    

    の結果を置くために、レコードこれらのシリーズ:

    select 
        min(timestamp) as start, 
        max(timestamp) as stop, 
        job, username 
    from ( 
        select timestamp, username, job, sum(switch) over w as series 
        from (
         select 
          timestamp, username, job, 
          (job is distinct from lag(job) over w)::int as switch 
         from my_log 
         window w as (partition by username order by timestamp) 
         ) s 
        window w as (order by username, timestamp) 
        ) s 
    group by username, job, series 
    order by 1; 
    
        start | stop | job | username 
    ----------+----------+-----+---------- 
    07:00:00 | 08:00:00 | 22 | bob 
    07:30:00 | 08:11:00 | 22 | joe 
    08:10:00 | 08:12:00 | 56 | bob 
    08:15:00 | 08:45:00 | 45 | joe 
    08:24:00 | 08:32:00 | 22 | bob 
    08:47:00 | 08:47:00 | 56 | joe 
    (6 rows)  
    

    Look here to see how it works.

    +0

    まさに私が探していたものです。私はあなたの答えから多くを学んだ。 リンクが優れた説明を追加しました!ありがとうございました! – wwwhack

    0

    新しい行を挿入する前に、新しいレコードを挿入しようとしているユーザーの前回の時刻(開始時刻)を選択し、新しい時刻と時刻の開始時刻を差し引いて最後に更新するトリガーを作成できますこれはあなたが2つの内のクエリでシリーズを指定し、最終的にmin()max()を見つけるために、ウィンドウ関数lag()sum()を使用することができますトリガ

    関連する問題