0

ID、ユーザー名、タイムスタンプの列を持つテーブルがあります。

ID ユーザー名のタイムスタンプ
1 AAA 2009 年 10 月 10 日
1 bbb 12/10/2010
2cc 2009/10/11
2 ddd 12/10/2010
2 ええ 12/05/2011
3 kkk 2012/04/03

出力には、最後に挿入された ID、ユーザー名が表示されます。

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

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

4

2 に答える 2

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;

同点の可能性がある場合 (同じidとを持つ 2 つの行timestamp)、これは両方の行を返します。を拡張して、必要な結合行を指定するか、結合行の 1 つを任意に取得するのではなく、分析関数order byを使用するように切り替えることができます。row_numberrank

于 2012-05-02T17:28:16.593 に答える
0

集計関数を使用する別のオプション。これにより、ジャスティンのクエリからサブクエリが削除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 など) が必要なため、少し奇妙です。これは、分割と順序付けによって決定論的なセットが機能する場合は混乱しますが、それ以外の場合は結果が一貫することを意味します。

于 2012-05-02T22:39:35.417 に答える