2013-02-22 174 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