从子查询计算百分比的 SQL 查询

标签 sql postgresql subquery aggregate-functions

我有一张表:log

+----+---------------------+---------------+
| ID |        Time         |    Status     |
+----+---------------------+---------------+
|  1 | 2016-07-19 03:20:12 | 200 OK        |
|  2 | 2016-07-20 05:20:12 | 404 NOT FOUND |
|  3 | 2016-07-19 00:00:00 | 200 OK        |
|  4 | 2016-07-20 10:20:12 | 404 NOT FOUND |
|  5 | 2016-08-05 07:00:02 | 404 NOT FOUND |
+----+---------------------+---------------+

我需要按“404 NOT FOUND”状态组按日期顺序按总数百分比合并数据。 (下面)

理想的结果

+---------------------+---------+
|        Date         | Errors  |
+---------------------+---------+
| 2016-07-20 00:00:00 | 0.66666 |
| 2016-08-05 00:00:00 | 0.33333 |
+---------------------+---------+

我不知道如何通过一个查询实现这一目标。当时,我是从这个查询开始的:

SELECT date_trunc('day',time) as "date", count(time) as errors
FROM log
WHERE status = '404 NOT FOUND'
GROUP BY date
ORDER BY errors DESC;

此查询结果:

+---------------------+--------+
|        Date         | Errors |
+---------------------+--------+
| 2016-07-20 00:00:00 |      2 |
| 2016-08-05 00:00:00 |      1 |
+---------------------+--------+

有什么想法或引用资料可以实现理想的结果吗?

最佳答案

要获得所需的输出,请尝试以下查询:

SELECT date_trunc('day',time) as "date", round((
  count(*)::decimal/(
            select count(*) from log WHERE status = '404 NOT FOUND')
),2) as errors
FROM log
WHERE status = '404 NOT FOUND'
GROUP BY date
ORDER BY errors DESC;

这将显示:

date                       errors
2016-07-20T00:00:00.000Z    0.67
2016-08-05T00:00:00.000Z    0.33

这是一个有效的 Fiddle

不用担心日期格式,在我的模式中我选择了timestamp 类型

关于从子查询计算百分比的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49195634/

相关文章:

mysql - 如何从更多表中选择唯一的最小值

mysql - 按多列分组后选择最大计数

MySQL自连接以获得过去的平均值

database - 在存储过程中传递超过 100 个参数 - PostgreSQL9.5

sql - 参数化表名

json - 如何使用 Postgres 在根级别更新多个 json 字段?

sql - 在 SQL 或 MySQL 中,我们可以连接一个表和一个子查询结果吗?

mysql - 为什么我不能在子查询中选择多于一列?

mysql - 使用默认值填充 mysql 表

mysql - 从 PostgreSQL 迁移到 MySQL 时出错 [42703]