Sql 对于在1小时之前创建通知的同一端点,查找没有通知的响应和以前没有响应的响应

Sql 对于在1小时之前创建通知的同一端点,查找没有通知的响应和以前没有响应的响应,sql,postgresql,Sql,Postgresql,背景 作为用户,我可以设置一个具有预期响应状态的端点,然后告诉web服务以给定的间隔(例如,每30分钟)ping该端点 问题 我想查找所有状态与关联端点的预期_状态不匹配的响应。对于每个响应,我在数据库中生成一个通知行。如果在不到一小时之前,同一端点的上一个响应行具有关联的通知行,我希望忽略此响应行 我制作了一把小提琴来展示我所追求的。看 在我的小提琴中,我期望SQL查询返回ID为2和5的响应。如你所见,我得到了身份证2,4和5 非常感谢您提供的任何帮助或指针。您可以使用“不存在”查找与要筛选依

背景

作为用户,我可以设置一个具有预期响应状态的端点,然后告诉web服务以给定的间隔(例如,每30分钟)ping该端点

问题

我想查找所有状态与关联端点的预期_状态不匹配的响应。对于每个响应,我在数据库中生成一个通知行。如果在不到一小时之前,同一端点的上一个响应行具有关联的通知行,我希望忽略此响应行

我制作了一把小提琴来展示我所追求的。看

在我的小提琴中,我期望SQL查询返回ID为2和5的响应。如你所见,我得到了身份证2,4和5


非常感谢您提供的任何帮助或指针。

您可以使用“不存在”查找与要筛选依据的条件匹配的行,也可以使用与要筛选依据的条件匹配的行在子选择上再次左键联接

当情况异常时,第一种情况可能表现得更好,因为只有在其他测试失败状态加上没有通知的情况下才进行测试:

    SELECT e.id, q.id, r.id, n.id, r.status, e.expected_status, n.response_id
      FROM endpoints e
      JOIN requests q on (q.endpoint_id = e.id)
      JOIN responses r on (r.request_id = q.id)
 LEFT JOIN notifications n on (n.response_id = r.id)
     WHERE r.status <> e.expected_status AND n.response_id IS NULL AND
           NOT EXISTS (SELECT 1
                       FROM requests q2
                       JOIN responses r2 ON (r2.request_id = q2.id)
                       JOIN notifications n2 ON (n2.response_id = r2.id)
                       WHERE q2.endpoint_id = e.id AND
                             r2.created_at < r.created_at AND
                             r2.created_at > r.created_at - INTERVAL '1h')
但在这种情况下,您可能会从第二种情况中受益:

    SELECT e.id, q.id, r.id, n.id, r.status, e.expected_status, n.response_id
      FROM endpoints e
      JOIN requests q ON (q.endpoint_id = e.id)
      JOIN responses r ON (r.request_id = q.id)
 LEFT JOIN notifications n ON (n.response_id = r.id)
 LEFT JOIN (
        SELECT q2.endpoint_id, r2.created_at
        FROM requests q2
        JOIN responses r2 ON (r2.request_id = q2.id)
        JOIN notifications n2 ON (n2.response_id = r2.id)
           ) prev ON (prev.endpoint_id = e.id AND prev.created_at < r.created_at AND prev.created_at > r.created_at - INTERVAL '1h')
     WHERE r.status <> e.expected_status AND
           n.response_id IS NULL AND
           prev.endpoint_id IS NULL

为什么不包括答复4?毕竟它没有通知,它的状态是500,预期是200。因为在不到一个小时之前创建了一个关联通知,有一个先前的响应。我只想包括至少一个小时前的响应,因为已经为同一个端点创建了带有通知的响应?从现在开始的时间?或者在特定响应的创建时间之前?在特定响应的创建时间之前。即,如果在23.30创建了带有关联通知的响应,并且在00.00和00.30为同一端点存在两个以上没有关联通知的响应。我希望只包括最后一个。顺便说一下,你的数据有问题。午夜前的回复与午夜后的回复日期相同,但应提前一天回复。您可以通过运行更新响应集created_at=created_at-interval'1d'来修复测试数据,其中created_at::time>'23:00';在运行这些查询之前。谢谢,我已经更新了SQL FIDLE以反映这一点。