2012-05-02 12 views
0

私はカラムid、username、timestampを持つテーブルを持っています。より最近挿入されたレコードを与える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 

私はこれを行うために結合を使用すると考えました。しかし、私は書くことができるより効率的なクエリはありますか?

+1

ジョインは効率的ですが、データベースはジョインを使用するように設計されています。 – HLGEM

答えて

2

あなたがタイ(同じidtimestampを有する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; 

を使用することができます。 order byを展開して、rankではなく、row_numberの解析関数を使用して、結び付けられた行のいずれかを任意に取得することができます。

+0

ありがとうございます。それは完璧に働いた。私はしかし、ユーザー名のパーティションもしました。 casrでは、同じ日に重複したユーザー名が挿入されています。 – mahen

+1

@mahen - 'username'と' id'でパーティション化すると、あなたが望む3つだけでなく、サンプルテーブルのすべての行が返されます。 –

+0

これは私がやっていることです。 DISTINCT USER_PRFLE_IDを選択 FROM TSYS_USER_NAME AS USER_NM(ps.USER_PRFLE_ID、 ps.BUS_APPL_ID、 ps.USER_NM、 ps.EFF_STRT_TS、 RANK(選択)OVER(ps.USER_PRFLE_ID BY PARTITION、ps.BUS_APPL_ID ORDER BY PS .EFF_STRT_TS DESC、ps.USER_NM DESC)USER_PRFLE_SNGL_SIGNON_REFパーティション(PTN_C30000101)PS FROM RNK 、 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 

は残念ながらLASTとFIRST関数の構文は、コマンドの先頭に集約関数の必要性(MAX、MIN、SUM、AVGなど)と、わずかに奇妙です。パーティションと順序付けが決定的なセットを提供するが、その結果が他と一貫していることを意味する場合、これは混乱します。

関連する問題