我有一个简单的日志表,想要计算每天的错误率。数据如下所示:
SELECT count(date(time)) as counts, date(time) as log_date, status
FROM log
GROUP BY log_date, status;
回报
counts | log_date | status
--------+------------+---------------
38431 | 2016-07-01 | 200 OK
274 | 2016-07-01 | 404 NOT FOUND
54811 | 2016-07-02 | 200 OK
389 | 2016-07-02 | 404 NOT FOUND
但我想要类似的东西
errors | log_date | totals
--------+------------+--------
274 | 2016-07-01 | 38705
389 | 2016-07-02 | 45845
401 | 2016-07-01 | 54378
我尝试过使用子查询,但这给了我一个总计而不是每日总计,即
SELECT count(*) as errors, date(e.time) as log_date, totals
FROM log e, (SELECT COUNT(*) as totals FROM log t) AS total_counts
WHERE e.status !='200 OK'
GROUP BY log_date, totals
ORDER BY log_date;
回报
errors | log_date | totals
--------+------------+---------
274 | 2016-07-01 | 1677735
389 | 2016-07-02 | 1677735
401 | 2016-07-03 | 1677735
如果我尝试在子查询中使用GROUP BY,我会得到不同的错误。我知道我很接近,但我不知道如何在同一天对外部和内部查询进行分组。
在聚合函数中使用case expression
(“条件聚合”)
SELECT
date(time) as log_date
, count(case when status <> '200 OK' then 1 end) as errors
, count(*) as totals
FROM log
GROUP BY
date(time)