sql - 同一表上的传递 SQL 查询

标签 sql postgresql self-join

嘿。考虑下表和数据...

in_timestamp | out_timestamp | name  | in_id | out_id | in_server | out_server | status
timestamp1   | timestamp2    | data1 |id1   | id2    | others-server1   | my-server1 | success
timestamp2   | timestamp3    | data1 | id2   | id3    | my-server1   | my-server2 | success
timestamp3   | timestamp4    | data1 | id3   | id4    | my-server2   | my-server3 | success
timestamp4   | timestamp5    | data1 | id4   | id5    | my-server3   | others-server2 | success
  • 以上数据代表一些数据跨服务器执行流的日志。
  • 例如一些数据从一些“outside-server1”流向一堆“my-servers”,最后流向指定的“others-server2”。

问题:

1) 我需要将此日志以可表示的形式提供给客户,客户不需要知道关于“我的服务器”的任何信息。我应该提供的只是数据进入我的基础设施和离开的时间戳;深入了解以下信息。

in_timestamp (of 'others_server1' to 'my-server1')
out_timestamp (of 'my-server3' to 'others-server2')
name 
status

同样想写sql!有人可以帮忙吗? 注意:可能不会一直有 3 个“我的服务器”。它因情况而异。例如例如,data2 可能涉及 4 个“我的服务器”!

2) 除了 SQL,还有其他替代方案吗?我是说存储过程/等等?

3) 优化? (记录数量庞大!截至目前,每天大约有 500 万条记录。我们应该显示长达一周的记录。)

提前感谢您的帮助! :)

最佳答案

WITH RECURSIVE foo AS
        (
        SELECT  *, in_timestamp AS timestamp1, 1 AS hop, ARRAY[in_id] AS hops
        FROM    log_parsing.log_of_sent_mails
        WHERE   in_server = 'other-server1'
        UNION ALL
        SELECT  t_alias2.*, foo.timestamp1, foo.hop + 1, hops || in_id
        FROM    foo
        JOIN    log_parsing.log_of_sent_mails t_alias2
        ON      t_alias2.in_id = (foo.t_alias1).out_id 
        )
SELECT  *
FROM    foo
ORDER BY
        hop DESC
LIMIT 1

关于sql - 同一表上的传递 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2578011/

相关文章:

Mysql 匹配 "Same"邮件

类似于 sql 的运算符仅获取数字

mysql - SQL如何根据条件计算每个ID的最后条目

django - docker tmpfs 似乎对 postgresql 没有影响

ruby - ActiveRecord::StatementInvalid 在/category/5

c# - 如何删除所有不需要的 TreeView 分支

SQL 查询性能的降低取决于搜索值的顺序

.net - 如何使用 ADO.NET 和 Oracle 在一次调用中运行多个不同的 `insert` 语句?

mysql - 更高效的内连接查询

Django Postgres ArrayField 与一对多关系