2012-05-02 90 views
0

我有一個表的列id,用戶名,時間戳。SQL給予最近插入的記錄

 
ID  Username  timestamp 
1  aaa   10/10/2009 
1  bbb   12/10/2010 
2  ccc   10/11/2009 
2  ddd   12/10/2010 
2  eee   12/05/2011 
3  kkk   04/03/2012 

輸出應該給我們提供最近插入的ID,用戶名。

 
1  bbb   12/10/2010 
2  eee   12/05/2011 
3  kkk   04/03/2012 

我想使用Join來做到這一點。但是,有沒有更有效的查詢我可以寫?

+1

連接是有效的,數據庫被設計爲使用連接。 – HLGEM

回答

2

您可以使用分析功能

SELECT id, 
     username, 
     timestamp 
    FROM (SELECT id, 
       username, 
       timestamp, 
       rank() over (partition by id 
           order by timestamp desc) rnk 
      FROM your_table_name) 
WHERE rnk = 1; 

如果有領帶(兩行具有相同idtimestamp)的可能性,這將返回兩行。您可以展開order by以指定您想要的綁定行中的哪一行,或者您可以使用row_number分析功能而不是rank來任意取得綁定行之一。

+0

謝謝。這工作完美。然而,我也在用戶名上做了一個分區。就在casr中,我們在同一天插入了重複的用戶名。 – mahen

+1

@mahen - 如果你使用'username'和'id'進行分區,你樣本表中的每一行都會被返回,而不僅僅是你想說的那三個。 –

+0

這就是我正在做的。 SELECT DISTINCT USER_PRFLE_ID, USER_NM AS TSYS_USER_NAME FROM (SELECT ps.USER_PRFLE_ID, ps.BUS_APPL_ID, ps.USER_NM, ps.EFF_STRT_TS, RANK()OVER(PARTITION BY ps.USER_PRFLE_ID,ps.BUS_APPL_ID ORDER BY PS .EFF_STRT_TS DESC,ps.USER_NM DESC)RNK FROM USER_PRFLE_SNGL_SIGNON_REF PARTITION(PTN_C30000101)PS, BUS_APPL_REF BA WHERE ps.VLD_IND = 'Y' AND ps.BUS_APPL_ID = 5 AND ps.BUS_APPL_ID = ba.BUS_APPL_ID 和Ba .APPL_NM ='TSYS') WHERE rnk = 1 – mahen

0

另一個使用聚合函數的選項。這會從Justin的查詢中刪除子查詢,但確實意味着LAST函數需要添加到每個返回的列上。

select 
    id, 
    max(username) keep (dense_rank last order by timestamp), 
    max(timestamp) 
from my_table 
group by id 

不幸的姓氏和函數的語法與在命令開始時需要一個聚集函數(MAX,MIN,SUM,AVG等)有點奇怪。這是令人困惑的,如果分區和排序提供了確定性的工作集,但意味着結果將是一致的,否則。