2013-02-22 226 views
2

我有一個事件表是這樣的:SQL用於報告基於事件

----------------------------------------------------------- 
timestamp   | station | event_type | count 
----------------------------------------------------------- 
2013-02-22 01:00:00 | 1  | log_in  | -1 
2013-02-22 01:05:00 | 1  | alert  | 5 
2013-02-22 01:08:00 | 1  | alert  | 3 
2013-02-22 01:10:00 | 1  | log_out  | -1 
2013-02-22 01:30:00 | 2  | log_in  | -1 
2013-02-22 01:31:00 | 2  | alert  | 2 
2013-02-22 01:35:00 | 2  | log_out  | -1 
----------------------------------------------------------- 

我如何寫SQL,產生這樣的報告:

-------------------------------------------------------------------------- 
station | log_in    | log_out    | count 
-------------------------------------------------------------------------- 
1  | 2013-02-22 01:00:00 | 2013-02-22 01:10:00 | 8 
2  | 2013-02-22 01:30:00 | 2013-02-22 01:35:00 | 2 
-------------------------------------------------------------------------- 

基本上,我想總結註銷登錄和註銷之間的警報。

有人能指點我正確的方向嗎?

更新:下面的作品

JW的回答,但我做到了上面的表中的錯誤。對於警報事件,我不知道站點ID,所以表格應該如下所示。

----------------------------------------------------------- 
timestamp   | station | event_type | count 
----------------------------------------------------------- 
2013-02-22 01:00:00 | 1  | log_in  | -1 
2013-02-22 01:05:00 | -1  | alert  | 5 
2013-02-22 01:08:00 | -1  | alert  | 3 
2013-02-22 01:10:00 | 1  | log_out  | -1 
2013-02-22 01:30:00 | 2  | log_in  | -1 
2013-02-22 01:31:00 | -1  | alert  | 2 
2013-02-22 01:35:00 | 2  | log_out  | -1 
----------------------------------------------------------- 
+0

如果沒有對應於log_in記錄的log_out記錄,報告會發生什麼情況? – peterm 2013-02-22 08:15:01

+0

理想情況下,SQL應處理該情況,即缺少的log_out與最後一次警報事件的時間相同。 – keithc 2013-02-22 11:33:10

回答

2
SELECT station, 
     MIN(timestamp) login, 
     MAX(timestamp) logout, 
     SUM(CASE WHEN count > 0 THEN count ELSE 0 END) count 
FROM tbaleName 
GROUP BY station 

UPDATE 1

SELECT a.station, 
     a.login, 
     a.logout, 
     SUM(CASE WHEN count > 0 THEN count else 0 END) count 
FROM 
     (
      SELECT station, 
        MIN(timestamp) login, 
        MAX(timestamp) logout 
      FROM tableName2 
      GROUP BY station 
     ) a 
     INNER JOIN tableName2 b 
      ON b.timestamp BETWEEN a.logIN and a.logout AND 
      a.station <> -1 
GROUP BY a.station, 
      a.login, 
      a.logout 

爲獲得更快的性能,請在列timestamp上添加INDEX

+0

嗨JW,你的回答是完美的,但我在我原來的帖子中實際犯了一個錯誤。對於警報事件,我不知道站點ID。在這種情況下,分組站不起作用。 – keithc 2013-02-22 11:44:13

+0

根據您的新數據,您期望的結果是什麼? – 2013-02-22 12:21:36

+0

嗨JW,期望的結果仍然是一樣的。我只需要通過時間戳而不是工作站ID鏈接警報事件。 – keithc 2013-02-22 16:58:09