2014-12-18 31 views
0

我在Oracle SQL Developer中編寫查詢。 基本上我想找到最新的每個ID的date_transaction記錄。現在我的查詢最多返回兩個記錄每個ID,每個狀態一個。Oracle SQL:查找每個ID號的最新事務

我當前的查詢:

select id, to_char(MAX(DATE_TRANSACTION),'MM/DD/YY HH24:MM:SS'), status, dkld.note 
from db_name.table1_name mtlr 
inner join (select * from db_name.table2_name where table_number = 308) dkld 
on dkld.integer_key = mtlr.status 
where id <> 0 and mtlr.date_transaction between (systimestamp - interval '1' hour) and systimestamp 
group id, status, dkld.note 
order by id 

樣品查詢返回:

| ID | max(date_transaction) | Status | Note | 
|--------------------------------------------------------| 
| 2 | 12/18/14 13:12:24 |  3 | In Transit | 
| 2 | 12/18/14 13:12:22 |  4 | Arrived | 
| 3 | 12/18/14 13:12:49 |  4 | Arrived | 
| 4 | 12/18/14 13:12:05 |  3 | In Transit | 
| 4 | 12/18/14 13:12:23 |  4 | Arrived | 

我真的很新的SQL,我不知道從哪裏何去何從。我怎樣才能縮小範圍,以便只獲取每個ID的最新記錄?

回答

1
SELECT * 
from db_name.table1_name mtlr 
WHERE NOT EXISTS (
    SELECT * from db_name.table1_name nx 
    WHERE nx.id = mtlr.id 
    AND nx.DATE_TRANSACTION > mtlr.DATE_TRANSACTION 
); 
+0

這是書面的,但表格中有大約20列,所以看起來有點難。你將如何改變它,以便它只選擇id,date_transaction和status? 當我自己做出改變時,我最終只能得到分鐘值= 12的時間(不知道這是怎麼發生的......) –

+0

另外,您的查詢的一些解釋將會很好 –

+0

恕我直言,不需要進一步解釋。如果沒有比* this *更近的事物,*這* *必須是**最近的事物。 – wildplasser

0

Max在技術上將數據分組。由於您有4列,並且所有4列的組合都是唯一的,所以它將有兩個條目。 我沒有測試過,有點如果低於這樣做,它應該返回每個ID只有一個條目(或概念)

select id, to_char(MAX(DATE_TRANSACTION),'MM/DD/YY HH24:MM:SS') 
from db_name.table1_name mtlr 
inner join (select * from db_name.table2_name where table_number = 308) dkld 
on dkld.integer_key = mtlr.status 
where id <> 0 and mtlr.date_transaction between (systimestamp - interval '1' hour) and systimestamp 
group by id 
order by id desc 
+0

這並不讓我每個ID只有一個date_transaction,所以道具爲。但我仍然需要包含dkld.notes或mtlr.status。儘管獲取每個ID的最近記錄非常重要,但數據沒有任何註釋或狀態是沒有意義的。 –