嘿。考虑下表和数据...
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/