我有一个像这样的事件表:
-----------------------------------------------------------
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
-----------------------------------------------------------
最佳答案
SELECT station,
MIN(timestamp) login,
MAX(timestamp) logout,
SUM(CASE WHEN count > 0 THEN count ELSE 0 END) count
FROM tbaleName
GROUP BY station
更新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
。
关于mysql - 用于基于事件进行报告的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15019435/