SQL Query根据最新时间戳

时间:2017-10-05 16:09:49

标签: sql oracle

我有一个表: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

2 个答案:

答案 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