sql - 在不到 1 小时前创建通知的同一端点上查找没有通知和先前没有响应的响应

标签 sql postgresql

背景

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

问题

我想找到所有 status 与关联端点的 expected_status 不匹配的响应。对于每个响应,我都会在数据库中生成一个通知行。如果同一端点的前一个响应行具有不到一小时前的关联通知行,我想忽略此响应行。

我创建了一个 fiddle 来演示我的目的。参见 http://sqlfiddle.com/#!15/0927b/1 .

在我的 fiddle 中,我希望 SQL 查询返回 ID 为 2 和 5 的响应。如您所见,我返回了 ID 2、4 和 5。

感谢任何帮助或指点。

最佳答案

您可以使用 NOT EXISTS 查找与您要过滤的条件相匹配的行,或者使用 LEFT JOIN 再次对子选择使用与您要过滤的条件相匹配的行。

第一种情况在条件异常时可能表现更好,因为测试仅在其他测试失败(状态加上没有通知)时完成:

    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

关于sql - 在不到 1 小时前创建通知的同一端点上查找没有通知和先前没有响应的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286445/

相关文章:

mysql - 不同教授和类(class)的 SQL 查询

sql - 如何根据日期字段选择不同的数据?

database - PostgreSQL 子选择问题

sql - 创建脚本来删除多个表(PostgreSQL)

sql - 使用CASE和GROUP BY进行数据透视的动态替代方案

sql - 转换 json 字段的输入

当我使用十进制时,mysql查询返回不正确

sql - 你能让这个查询更快吗?

sql - ActiveRecord 嵌套 SELECT

postgresql - 在 JasperReports Server (postgresql) 中运行 iReport 设计的报告时出错