Postgres子查询按日期分组

问题描述 投票:0回答:1

我有一个简单的日志表,想要计算每天的错误率。数据如下所示:

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,我会得到不同的错误。我知道我很接近,但我不知道如何在同一天对外部和内部查询进行分组。

postgresql
1个回答
2
投票

在聚合函数中使用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)
© www.soinside.com 2019 - 2024. All rights reserved.