gpt4 book ai didi

sql - 子查询百分比中多于一行

转载 作者:行者123 更新时间:2023-11-29 13:47:02 24 4
gpt4 key购买 nike

SELECT 
status, date(time),
round((SELECT count(*)
FROM log
WHERE status NOT LIKE '200 OK'
GROUP BY date(time)
ORDER BY date(time)) /
(SELECT count(*)
FROM log
GROUP BY date(time)
ORDER BY date(time))) * 100 AS percent
FROM
log
GROUP BY
date(time), status, percent
ORDER BY
date(time);

我已经为它编写了代码,但是没有任何响应,我正在使用 postgreSQL。我想要的最后一件事是找到每天的错误百分比状态(查看有 200 Ok 或未找到的状态列)。

对于 EG-- 2016/07/22 - 1.5% 错误

P.S 数据库真的很大,有不同的状态和日期,我想要明智的结果日期在上面的代码中,我试图找到每天的(未找到状态/总状态)

最佳答案

现有查询的问题:

  • 到目前为止,您解决它的方法需要扫描表 “log” 3 次,从而导致巨大的性能成本
  • 在这里>> WHERE status NOT LIKE '200 OK' << 您正在查找精确值匹配“200 OK”而不是模式匹配,因此您可以放弃使用 LIKE 并像那样使用 NOT()>> WHERE NOT status = '200 OK'或这样的 > 运算符:WHERE status <> '200 OK'
  • 为了将高数与低数相除,您需要将整数转换为数字

对于后一个快速示例:

SELECT 1 / 10;          -- results to 0
SELECT 1::numeric / 10; -- results to 0.10000000000000000000

解决方案

要解决所有提到的问题并改进查询并获得预期结果(如果我确实正确理解了预期结果),然后使用 WINDOW 函数,这可以通过简单的查询来解决:

-- The query
SELECT date(time),
round(
(count(1) FILTER (WHERE NOT status = '200 OK'))::numeric * 100 / count(1),
1
) AS errors_rate
FROM log
GROUP BY 1
ORDER BY 1;

-- Should return something like this:

time | errors_rate
------------+------------
2016-07-05 | 1.2
2016-07-06 | 1.3
2016-07-07 | 1.5
...

一些有用的读物​​:

PG Docs: Aggregate Expressions
PG Docs: Window functions
"The FILTER clause in Postgres 9.4" by Anderson Dias

关于sql - 子查询百分比中多于一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com