2017-10-05 107 views
0

我有一个表:​​,它存储从应用程序发送到另一个的消息的详细信息。 如果消息失败,则状态设置为“ERR”。有一个重试机制,可以自动重试发送错误消息。重试时,消息可能成功(OUT)或再次出错。SQL Query基于最新时间戳获取最新消息

我需要构建一个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 

数据库:甲骨文

+0

根据你写的内容,你可以检索where status = Err并且不存在任何具有更大时间戳的同一个id的行,不是? –

+0

@ stephen.vakil,我不确定这会工作,因为消息可能会从ERR到OUT,然后可能再次ERR。因此,我正在查找最新的时间戳并且不会超过ERR消息的时间戳。 –

+0

我不关注。如果没有更多时间戳的id记录,那么您就是最新的记录。 –

回答

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'

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); 

返回从2017-05-10 2017-05-10 10:00:00.0

B456记录请参见SQL Fiddle