2

次のようなイベントテーブルがあります。

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

1 に答える 1

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

更新 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

INDEXパフォーマンスを高速化するには、 on columnを追加しますtimestamp

于 2013-02-22T08:02:02.670 に答える