嗨我在postgres中有两个表,它们具有如下所示的相似结构
表A
╔═══════════════════════════════════════════════════╗
║ id | timestamp | type | category ║
╠═══════════════════════════════════════════════════╣
║ 1 | 2014-02-11 01:10:34.1234 | A | 1 ║
║ 2 | 2014-02-11 01:10:36.7533 | A | 2 ║
║ 3 | 2014-02-11 01:10:39.914 | E | 1 ║
║ 4 | 2014-02-11 01:10:42.6712 | E | 3 ║
║ 5 | 2014-02-11 01:10:34.9123 | E | 1 ║
║ 6 | 2014-02-11 01:10:36.0313 | C | 2 ║
║ 7 | 2014-02-11 01:10:39.1234 | X | 1 ║
║ 7 | 2014-02-11 01:10:40.6743 | X | 1 ║
║ 8 | 2014-02-11 01:10:42.9092 | B | 3 ║
║ 9 | 2014-02-11 01:10:43.8234 | T | 1 ║
║ 10 | 2014-02-11 01:10:45.1566 | T | 1 ║
║ 11 | 2014-02-11 01:10:58.7344 | T | 1 ║
║ 12 | 2014-02-11 01:10:59.9232 | T | 1 ║
║ 13 | 2014-02-11 01:10:59.9232 | T | 3 ║
║ 14 | 2014-02-11 01:10:59.9232 | T | 2 ║
║ 15 | 2014-02-11 01:10:59.9232 | T | 2 ║
╚═══════════════════════════════════════════════════╝
表B
╔═══════════════════════════════════════════════════╗
║ id | timestamp | type | category ║
╠═══════════════════════════════════════════════════╣
║ 1 | 2014-02-11 01:10:34.123 | A | 1 ║
║ 2 | 2014-02-11 01:10:35.9092 | A | 2 ║
║ 3 | 2014-02-11 01:10:36.1234 | E | 1 ║
║ 4 | 2014-02-11 01:10:40.0100 | E | 3 ║
║ 5 | 2014-02-11 01:10:51.1234 | E | 2 ║
║ 7 | 2014-02-11 01:10:54.5347 | X | 1 ║
║ 8 | 2014-02-11 01:11:02.7914 | B | 3 ║
║ 9 | 2014-02-11 01:11:03.9000 | T | 1 ║
║ 10 | 2014-02-11 01:11:05.7829 | T | 1 ║
║ 11 | 2014-02-11 01:11:06.125 | T | 1 ║
║ 12 | 2014-02-11 01:11:10.0000 | T | 1 ║
║ 13 | 2014-02-11 01:10:59.9232 | T | 3 ║
║ 14 | 2014-02-11 01:10:59.9232 | T | 2 ║
╚═══════════════════════════════════════════════════╝
如果最后5条记录与类别字段匹配,那么我希望在存储过程中比较给定类型的最后5条记录 如果即使一个人没有多少,那么这一切都是失败的。
在类型和时间戳上进行连接是很诱人的,但是表上的时间戳永远不会精确,因为第二个表数据来自外部系统。 (在这种情况下不可能使用NTP)
e.g。
在上表中,类型A和B是成功的,因为它们具有完全相同的最后5条记录,这些记录在相同的顺序中属于同一类别,即使它们中的非共有总共5个。
E失败,因为他们都有三个记录,但第二个表的最后一个类别是2而不是1。
C失败,因为表B中不存在
T失败,因为最后5个不匹配。
我希望将两个数据集作为独立数组返回,而不是通过for循环和一个索引来比较各个字段,但是没有看到在postgres中以这种方式使用的数组,请指出我正确的方向。 / p>
所有postgres示例似乎遍历单个表的记录。
答案 0 :(得分:2)
这是一个SQL查询,它为您提供没有存储过程的结果:
select ta.type, case when ta.str_agg = tb.str_agg then 'success' else 'failed' end
from
(select type, array_to_string(array_agg(category order by timestamp desc), ',') as str_agg
from (select * from table_a as t where t.id in (select id from table_a WHERE type = t.type order by timestamp desc LIMIT 5)) as t1
group by type) as ta
LEFT JOIN
(select type, array_to_string(array_agg(category order by timestamp desc), ',') as str_agg
from (select * from table_b as t where t.id in (select id from table_b WHERE type = t.type order by timestamp desc LIMIT 5)) as t1
group by type) as tb
ON (ta.type = tb.type)