我有一个表:msg_status
,它存储从应用程序发送到另一个应用程序的消息的详细信息。
如果消息失败,则状态设置为" ERR
"。有一种重试机制可以自动重试发送错误消息。重试后,消息可能会成功(OUT
)或再次出错。
我需要构建SQL
查询框架,该查询仅显示最新消息状态为ERR
的消息。
因此,我的查询应显示message ID B456
而非A123
。
我构思了以下问题:
select a.* from msg_status a where a.message_status = 'ERR' and a.id in
(select b.id from msg_status b where b.message_status = 'OUT' group by b.id having max (a.timestamp) > max (b.timestamp) )
查询有效,但速度很慢。你能告诉我如何调整这个查询以便更快地检索数据。如果您可以建议任何替代查询,我也可以。
下表:
ID Message_Status Timestamp
A123 OUT 05-10-17 11:00
B456 ERR 05-10-17 10:00
B456 OUT 05-10-17 9:00
A123 ERR 05-10-17 8:00
B456 ERR 05-10-17 7:00
C789 OUT 05-10-17 6:00
数据库: Oracle
答案 0 :(得分:0)
select id
,message_status
,time_stamp
from
(select *, row_number() over(partition by message_status order by time_stamp desc) as rn
from mytable tb1
where tb1.message_status = 'ERR') tb1
where tb1.rn = 1
我认为这应该有效,但我不知道表现是否比你的好。这应始终选择最新的message_status = 'err'
答案 1 :(得分:0)
您想要的只是状态为ERR的记录,并且不存在相同ID的后续记录
select * from
msg_status a where message_status = 'ERR' and not exists
(select b.id from msg_status b where a.id = b.id and b.timestamp> a.timestamp);
仅返回B456
2017-05-10 2017-05-10 10:00:00.0
记录
请参阅SQL Fiddle