2017-10-05 109 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