2011-06-27 64 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每天爲每個人,使數我可以把這個餵給excel。

輸出示例:

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 

編輯:數據更有意義

+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對於同一天的不同作業運行會是相同的,所以我們會將其敲除。

擺脫這兩個字段留給我們一個相當直接的GROUP BY查詢。我不知道你的數據庫的具體情況,因此,出於這個問題的目的,我會假設你的數據庫有一個返回日期部分時間戳的DATE()函數。除非您在問題中遺漏了重要細節,否則batch_log表的存在是一個紅鯡魚。你真的只想要SELECT userid, DATE(time_of_screwup), count(*) FROM screwups GROUP BY userid, DATE(time_of_screwup)

+0

是的,複製粘貼錯誤,其不準確的數據,它的一個快速hackup。 – davidahines

+0

我需要time_elapsed的batch_log。 – davidahines

+0

如果用戶在同一天運行兩個作業,幾乎可以肯定'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

相關問題