我的数据库中有一个“警报”表,用于存储我的网络应用状态代码。这些状态代码是从用python编写的任务调度程序获得的,它定期查询前端api和后端api,并将响应中返回的结果状态代码存储到各自的列中:frontend_status
和backend_status
。
我正在尝试做一个简单的(至少听起来很简单)sql查询,以检查其中一列中的两个或多个连续条目是否为200以外的其他条目(意味着可能出错)。如果是,我想使用布尔值来采取行动。我不确定我是否遗漏了一些明显的东西,但有些帮助会很棒。
我在postgres中创建了一个表,看起来像这样:
-- Table: public.alert_001
-- DROP TABLE public.alert_001;
CREATE TABLE public.alert_001
(
data_id integer NOT NULL DEFAULT nextval('alert_001_data_id_seq'::regclass),
when_captured timestamp without time zone NOT NULL,
frontend_status real,
backend_status real,
CONSTRAINT alert_001_pkey PRIMARY KEY (data_id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.alert_001
OWNER to postgres;
-- Index: alert_001_when_index
-- DROP INDEX public.alert_001_when_index;
CREATE INDEX alert_001_when_index
ON public.alert_001 USING btree
(when_captured)
TABLESPACE pg_default;
然后我设法写了一个查询,计算过去一小时内某个值的条目数。例如,如果计数的条目大于2,则返回布尔值true。但是,虽然这可以在最后一小时内拾取两个条目时起作用,但它们不一定是连续的条目。所以我的SQL查询看起来像:
SELECT (SELECT COUNT(*) AS "Count"
FROM alert_001 WHERE when_captured > NOW() - '1 hour'::INTERVAL AND backend_status != 200) > 2
有人能指出我正确的方向来捕捉三个或更多连续的条目,这些条目不是状态代码200吗?
以下是alert_001表中条目的示例:
when_captured,frontend_status, backend_status
'2018-02-02 14:55:19.63941','200','200'
'2018-02-02 14:54:19.636386','200','503'
'2018-02-02 14:53:19.636055','200','503'
'2018-02-02 14:52:19.631958','200','503'
'2018-02-02 14:51:19.62166','200','200'
'2018-02-02 14:50:19.621363','200','200'
'2018-02-02 14:49:19.612434','200','200'
'2018-02-02 14:48:19.611919','200','200'
'2018-02-02 14:47:19.610065','200','200'
'2018-02-02 14:46:19.607846','200','200'
正如您所看到的,有三个连续的条目带有503 backend_status
代码,我想抓住这些代码。那么,如果找到三个以上,那么正确的sql查询的预期输出可能是True
,否则False
?
答案 0 :(得分:1)
您应该使用窗口函数:
e