检测两个或多个连续行是否与sql查询具有相同的条目

时间:2018-02-02 07:42:59

标签: sql postgresql

我的数据库中有一个“警报”表,用于存储我的网络应用状态代码。这些状态代码是从用python编写的任务调度程序获得的,它定期查询前端api和后端api,并将响应中返回的结果状态代码存储到各自的列中:frontend_statusbackend_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

1 个答案:

答案 0 :(得分:1)

您应该使用窗口函数:

e