Postgresql 在SQL中编写子查询

Postgresql 在SQL中编写子查询,postgresql,subquery,Postgresql,Subquery,我正在学习PostgreSQL,我有一个数据库日志,其中包含以下列:路径文本、ip inet、方法文本、状态文本、时间timestamptz、id int 使用此数据库,我的目标是找到任何状态为错误百分比的天数!='200正常/状态超过2.5%。我有一个查询,如下所示,它以小数形式表示错误百分比,但我不知道如何将它们乘以10,使它们成为“百分比”,也不知道如何检查它们是否超过2.5 我尝试过在多个点中同时使用HAVING和WHERE,但我要么在groupby中遇到编程错误,要么在我输入HAVIN

我正在学习PostgreSQL,我有一个数据库日志,其中包含以下列:路径文本、ip inet、方法文本、状态文本、时间timestamptz、id int

使用此数据库,我的目标是找到任何状态为错误百分比的天数!='200正常/状态超过2.5%。我有一个查询,如下所示,它以小数形式表示错误百分比,但我不知道如何将它们乘以10,使它们成为“百分比”,也不知道如何检查它们是否超过2.5

我尝试过在多个点中同时使用HAVING和WHERE,但我要么在groupby中遇到编程错误,要么在我输入HAVING或WHERE的位置出现语法错误。将其更改为百分比并检查其是否超过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

在sqlfiddle中共享一个测试用例之后,我们就可以开始运行代码了

小提琴在这里:

不需要将结果乘以100,只需检查已经乘以的0.025,不是吗?我的意思是,如果你的值在0-1之间,等于2.5%的值就是0.025

因此,该命令应能:

select views.day, views.cnt from
 (select datelog.day,
  (
   cast(count(case when datelog.status != '200 OK' then 1 else null end) as float)
   /
   cast(count(*) as float)
  ) as cnt
  from (select DATE(time) as day, status from log) as datelog
  group by datelog.day
 ) as views
 where views.cnt > 0.025

最后一次修订是在这里的回复中得到的:

将问题分解为更小的问题。百分比是多少?这是两个数字的比率。这两个数字是多少?您需要计数状态=200和计数状态!=200我想如果你每天都能计算出错误的数量,你会发现剩下的就很容易了。@Brandon我能计算出状态的数量!=200和每天的总请求数。问题是我如何测试两者的比率是否大于2.5%,在外部选择上放置一个WHERE或have,它有一个语法错误或一个column views not found错误我尝试了这两种方法,但得到了编程错误:column'views'不存在?另外,我尝试将其设置为2.5而不是0.025的原因是,我需要将其显示给python,而不必在python中将ie时间更新100次。当我这样做时,我在GROUP by上得到了一个语法错误,而不是列错误,你不认为你在两个子选择上遗漏了一个paren吗?我的意思是,我阅读/作为视图-因此相反/作为视图不应该这样做?Woops我不小心键入了文章,但没有,它仍然提供了一个视图不存在错误您在第二个子查询中也缺少了“来自日志”: