2011-06-27 16 views
0

タイムスタンプのあるレコードがテーブルにある場合、各ユーザーの毎日の結果を結果セットの行として追加情報とともに取得するようにクエリを行う方法別のテーブル?特定の期間中の各日付の行の選択

例:

batch_log

id | userid | batchid | start_time   | end_time   |time_elapsed 
---------------------------------------------------------------------------------- 
1 | bob | 123sgd |2011-06-23 18:00:00 | 2011-06-23 18:12:00 | 00:12:00 
2 | jim | 234sgd |2011-06-22 12:00:00 | 2011-06-22 12:12:00 | 00:12:00 
3 | bob | 1234gd |2011-06-23 19:00:00 | 2011-06-23 19:08:00 | 00:08:00 
4 | bob | 1Abeds |2011-06-22 19:00:00 | 2011-06-23 20:24:00 | 00:24:00 

は私がなるように、私は一人一人のために、毎日、時間の経過とscrewups数の両方を得ることができるように選択するにはどうすればよい

id | userid | time_of_screwup 
--------------------------------------------- 
1 | bob |2011-06-23 19:29:16 
2 | jim |2011-06-23 16:29:24 
3 | bob |2011-06-22 12:29:16 
4 | bob |2011-06-23 13:29:16 

をscrewups私はこれを優れたものにすることができます。

出力例:

userid | date  |COUNT(time_elapsed)| COUNT(screwups)| 
------------------------------------------------------------ 
    bob | 2011-06-23 | 00:20:00   | 2 
    jim | 2011-06-22 | 00:12:00   | 1 
    bob | 2011-06-22 | 00:24:00   | 1 

EDIT:データ

+0

ジョイントとGROUP BY DATE( 'time_of_screwup')が役立つ場合があります。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_dateを参照してください – Fabio

答えて

0

はあなたの結果にidフィールドを持つ、より理にかなって本当に意味がないので、私は、そのフィールドが存在することをちょうど無視します。同様に、私はtime_elapsedが同じ日に異なるジョブランで同じであると疑うので、それをノックアウトします。

この2つのフィールドを削除すると、わかりやすいGROUP BYというクエリが表示されます。私はあなたのデータベースの詳細を知らないので、この問題の目的のために、あなたのDBには、タイムスタンプの日付部分を返すDATE()関数があると仮定します。あなたの質問に重要な情報を残していない限り、batch_logテーブルの存在は赤いニシンです。あなたは本当にちょうどSELECT userid, DATE(time_of_screwup), count(*) FROM screwups GROUP BY userid, DATE(time_of_screwup)にしたいです。

+0

ええ、コピーのエラー、その正確ではないデータは、迅速なハックアップ。 – davidahines

+0

私はtime_elapsedにbatch_logが必要です。 – davidahines

+0

ユーザーが同じ日に2つのジョブを実行した場合、 'time_elapsed'が異なることはほぼ確実です。あなたの質問をもっとうまく説明しない限り、両方の仕事に不具合がある場合、この値を返す賢明な方法はありません。適切な答えが必要な場合は、あなたの質問をより明確に表現する必要があります。いずれの場合でも、データベースに 'time_elapsed'を格納することは非常に冗長です。開始時刻と終了時刻はとにかくその記録。 –

0

次のようなものがあります。バッチ処理が日々に及ぶ場合(たとえば、6月30日午後11時50分開始、7月1日午前12時10分に終了)に対応するため、開始日に基づいて任意の日にイベントを割り当てます。

RDBMSを指定していないため、このコードはSQL Server用です。これは、日付/時刻の値がSQL ServerのDATETIMEであり、経過時間がSUM()が数値で—で動作する可能性があるデータ型として表されることを前提としています。

select userid    = t.userid , 
     report_date  = t.dtEvent , 
     total_batch_runs = sum(case is_batch when 1 then 1 else 0 end) , 
     total_screwups  = sum(case is_batch when 1 then 0 else 1 end) , 
     total_elapsed_time = sum(t.elapsed_time) , 
from (select userid  = userid    , 
       is_batch  = 1 , 
       dtEvent  = date(start_time) , -- date() only appropriate for SQL Server 2008 
       elapsed_time = time_elapsed , 
     from dbo.batch_log 
     UNION ALL 
     select userid  = userid , 
       is_batch  = 0 , 
       dtEvent  = date(time_of_screwup) , -- date() only appropriate for SQL Server 2008 
       elapsed_time = null 
     from dbo.screwups 
    ) t 
group by t.userid , t.dtEvent 
+0

これはMYSQLです。私はあなたがSQLでこのようなことをすることができるかどうかはわかりませんでした。 – davidahines

関連する問題