【发布时间】:2017-05-26 10:37:13
【问题描述】:
我正在学习 PostgreSQL,并且我有一个包含以下列的数据库日志:路径文本、ip inet、方法文本、状态文本、时间时间戳记、id int
使用此数据库,我的目标是找到错误百分比(状态!= '200 OK' / 状态)超过 2.5% 的任何日子。我有如下查询,它以小数形式得到错误百分比,但我不知道如何将它们乘以 10 以使它们成为“百分比”,也不知道如何检查它们是否超过 2.5。
我已经在多个地方同时尝试了 HAVING 和 WHERE,但是无论我在哪里输入 HAVING 或 WHERE,我都会在 group by 处遇到编程错误或语法错误。将其更改为百分比并检查其是否超过 2.5 的正确方法是什么?提前致谢
模拟数据:
CREATE TABLE log (
path text,
ip inet,
method text,
status text,
"time" timestamp with time zone DEFAULT now(),
id integer NOT NULL
);
INSERT INTO log VALUES ('/article/bears-love-berries', '198.51.100.76' , 'GET', '200 OK', '2016-07-1 12:54:22+00', 3355597);
INSERT INTO log VALUES ('/article/candidate-is-jerk', '198.51.100.76' , 'GET', '200 OK', '2016-07-1 19:54:22+00', 3355598);
INSERT INTO log VALUES ('/article/bears-love-berries', '198.51.100.76' , 'GET', '404 NOT FOUND', '2016-07-1 22:54:22+00', 3355599);
INSERT INTO log VALUES ('/article/goats-eat-googles', '203.0.113.42' , 'GET', '200 OK', '2016-07-11 12:54:22+00', 3355600);
INSERT INTO log VALUES ('/article/candidate-is-jerk', '203.0.113.42' , 'GET', '200 OK', '2016-07-11 17:54:22+00', 3355601);
INSERT INTO log VALUES ('/article/bears-love-berries', '203.0.113.42' , 'GET', '200 OK', '2016-07-11 19:54:22+00', 3355602);
INSERT INTO log VALUES ('/article/goats-eat-googles', '203.0.113.42' , 'GET', '404 NOT FOUND', '2016-07-15 13:54:22+00', 3355603);
INSERT INTO log VALUES ('/article/bears-love-berries', '198.51.100.34' , 'GET', '200 OK', '2016-07-15 20:54:22+00', 3355604);
INSERT INTO log VALUES ('/article/candidate-is-jerk', '198.51.100.34' , 'GET', '200 OK', '2016-07-15 23:54:22+00', 3355605);
INSERT INTO log VALUES ('/article/candidate-is-jerk', '203.0.113.12' , 'GET', '200 OK', '2016-07-21 19:54:22+00', 3355606);
INSERT INTO log VALUES ('/article/bears-love-berries', '203.0.113.12' , 'GET', '200 OK', '2016-07-21 12:54:22+00', 3355607);
INSERT INTO log VALUES ('/article/goats-eat-googles', '198.51.100.76' , 'GET', '200 OK', '2016-07-21 01:54:22+00', 3355608);
INSERT INTO log VALUES ('/article/goats-eat-googles', '198.51.100.76' , 'GET', '404 NOT FOUND', '2016-07-29 07:54:22+00', 3355609);
INSERT INTO log VALUES ('/article/candidate-is-jerk', '198.51.100.76' , 'GET', '404 NOT FOUND', '2016-07-29 20:54:22+00', 3355610);
INSERT INTO log VALUES ('/article/goats-eat-googles', '198.51.100.34' , 'GET', '200 OK', '2016-07-29 19:54:22+00', 3355611);
查询:
SELECT DATE(time) AS day,
(
(SELECT CAST(COUNT(status) AS FLOAT)
FROM log WHERE status != '200 OK') /
(SELECT CAST(COUNT(status) AS FLOAT))
) AS views
FROM log GROUP BY day
ORDER BY views
【问题讨论】:
-
把问题分解成更小的问题。什么是百分比?这是两个数字的比率。这两个数字是多少?你需要一个 count status = 200 和一个 count of status != 200。我认为如果你能计算每天的错误,你会发现剩下的很容易。
-
@Brandon 我可以找到状态计数!= 200 和每天的总体请求计数。问题是我如何测试两者的比率是否大于 2.5%,在外部 SELECT 上放置 WHERE 或 HAVING 它有语法错误或未找到列视图错误
标签: postgresql subquery