mysql - 用于基于事件进行报告的 SQL

标签 mysql sql reporting

我有一个像这样的事件表:

-----------------------------------------------------------
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/

相关文章:

mysql - MySQL 中的环回 HasAndBelongToMany

java - MySQL 在 spring-security.xml 中查询授权

mysql - 改进 SQL 查询

reporting - 如何使用适用于 OpenOffice/LibreOffice 的 OpenERP 报表设计器插件获取字段列表

sql - 创建要传递到存储过程的 week_ref 编号

mysql - 如何从包含多个数据库的 mysqldump 中恢复一个数据库?

php - 如何修复列数与行值数不匹配

java - JDBC - 选择列为 NULL 的位置

MySQL MAX 函数混合行

java - 报告生成器 Java