2011-08-03 14 views
1

を取得するために、私は私のデータベースSQLクエリの平均時間

ユーザー名、日付、時刻の4列、LoginType

UserName is a varchar field 
Date is a date field 
Time is a time field (in 24 hour format) 
LoginType is a varchar field 

LoginType 2つの文字列の一つの "LOGIN"、 "SHUTDOWN"

を含めることができますがあります

私は誰かがログインまたはシャットダウンする平均時間を取得したい 私はまた、lateless、earlinessのデルタを知りたいです。

だからこの例では、10:30

によって学生が午前8時30によるクラスをattentなければならないことを前提としなければならないLOGOFFすることができますので、また

George.Lucas 8:45 2011-07-22 LOGIN 
Eric.TheRed 9:00 2011-07-22 LOGIN 
Dr.Who 9:01 2011-07-22 LOGIN 
Dr.Who 11:01 2011-07-22 SHUTDOWN 
George.Lucas 11:45 2011-07-22 SHUTDOWN 
Eric.TheRed 12:00 2011-07-22 SHUTDOWN 
  1. を次のようにサンプルデータがあると仮定することができますジョージは15分遅れ、シャットダウンは1時間15分遅くなりました。
  2. Ericはログインに30分遅れました
  3. Ericはシャットダウンに2時間30分遅れました
  4. Dr.Whoは場合でも、
  5. Dr.Whoが31分遅れてSHUTDOWN

おかげ

+0

複数のセッションのようにデータに重複するユーザー名が存在する可能性はありますか? –

+0

はい、同じ日に同じ人物に対して複数のレコードが存在する可能性があります。 –

答えて

1

これはあなたに与えられたユーザがログインし、シャットダウンの間かかった平均時間を与えるだろうし31分遅れてLOGINましたそこに、同じ日に複数のセッションがあり、ユーザーは再度ログインする前にシャットダウンする必要があると仮定:

SELECT login.UserName, 
    AVG(shutdown.Date - login.Date) 
FROM table login, 
    table shutdown 
WHERE login.UserName = shutdown.UserName 
     AND login.LoginType = 'LOGIN' 
     AND shutdown.LoginType = 'SHUTDOWN' 
     AND shutdown.Date = (SELECT MIN(t.Date) 
          FROM table t 
          WHERE t.UserName = login.UserName 
           AND t.LoginType = 'SHUTDOWN' 
           AND t.Date > login.Date) 
GROUP BY login.UserName; 

期待されると効果的なログイン/ shutdoの違いを見つけるにはあなたはちょうどlogin.Timeshutdown.Timeから8:30と10:30を引く必要があります。

+0

こんにちは、ありがとうございました。しかし、あなたの計算では、シャットダウンとログインの違いが分かります。異なる日付の2つのログイン間の平均が必要です(2010年7月22日から8.3.2011までのように)。また、シャットダウンのAVGが必要です –

+0

これは私が探していたものではなく、誰も知らないからです。私はあなたの答えを "受け入れる"でしょう。 –