やりたいことは以下のとおりです。ジョブのログを管理するテーブルから、ジョブ名ごとに各ログレベル(CRITICAL, ERROR, WARN)のカウントを集計する方法をメモしておきます。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
+------+----------+------------+ +------+----------+-------+------+ | |
| name | level | date | | name | CRITICAL | ERROR | WARN | | |
+------+----------+------------+ +------+----------+-------+------+ | |
| job1 | ERROR | 2019-04-01 | -> | job1 | 0 | 1 | 2 | | |
| job1 | WARN | 2019-04-02 | | job2 | 1 | 0 | 2 | | |
| job1 | WARN | 2019-04-03 | | job3 | 0 | 0 | 3 | | |
| job2 | CRITICAL | 2019-04-01 | +------+----------+-------+------+ | |
| job2 | WARN | 2019-04-02 | | |
| job2 | WARN | 2019-04-03 | | |
| job3 | WARN | 2019-04-01 | | |
| job3 | WARN | 2019-04-02 | | |
| job3 | WARN | 2019-04-03 | | |
+------+----------+------------+ |
GROUP BY
とCASE
とSUM
を使う
先にSQLを載せておきます。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SELECT | |
name, | |
SUM(CASE WHEN level = 'CRITICAL' THEN 1 ELSE 0 END) AS CRITICAL, | |
SUM(CASE WHEN level = 'ERROR' THEN 1 ELSE 0 END) AS ERROR, | |
SUM(CASE WHEN level = 'WARN' THEN 1 ELSE 0 END) AS WARN | |
FROM | |
log | |
GROUP BY | |
name |
まずは、GROUP BY
でジョブ名ごとにグルーピングします。続いて、CASE
式を使って各ログレベルが存在するかどうかの条件を設定し、SUM
で各ログレベルの数をカウントしています。
まとめ
SQLでグループごとに条件を指定してカウントする方法でした。GROUP BY
とCASE
とSUM
を使えばOKです。