3

私はOracleを初めて使用し、最近問題に遭遇しました:

次の列を持つテーブルがあります: person_id、account_login、add_date。

person_id | account_login | add_date
----------|---------------|------------
1         | user1         | 2012-07-10
1         | user2         | 2012-07-09
2         | user3         | 2012-07-05
2         | user4         | 2012-07-04

1 人が複数の account_logins を持つことができます。すべての人について、最も古い account_login をフェッチしたい:

person_id | account_login | add_date
----------|---------------|------------
1         | user2         | 2012-07-09
2         | user4         | 2012-07-04

だから私がしたことは:

select
  person_id,
  MAX(account_login) KEEP (DENSE_RANK FIRST ORDER BY add_date)
from
  table
group by
  person_id;

必要な結果が正確に得られますが、クエリの構文はあまり良くないと思います..Oracleは集約関数を使用するように強制し、MAX()またはMIN()を使用しましたが、それは完全に無意味です..

これよりも優れたクエリを作成する方法はありますか? (オラクル 11g)

4

2 に答える 2

2

DENSE_RANK を単独で分析として使用し、結果のクエリから選択できます。

SELECT person_id, account_login, add_date
  FROM (SELECT table.*
             , DENSE_RANK() OVER (PARTITION BY person_id ORDER BY add_date) rnk
         FROM table)
 WHERE rnk = 1;

どちらのバージョンがよりエレガントだと思うかわかりません。また、特定の person_id に対して同じ日に作成された 2 つのアカウントがある場合の対処方法についても説明していません。add_date に時間コンポーネントもある場合は、問題ありません。同点の可能性が高い場合は、おそらく ROW_NUMBER() の方がより望ましい結果が得られるでしょう。

于 2012-07-13T21:09:37.937 に答える
0

このように、テーブルとネストされたビューを結合できます

select person_id,account_login,add_date
from tab inner join 
(select person_id,min(add_date) add_date 
from tab group by person_id) 
using(person_id,add_date)

ところで、これがはっきりしているとは本当に思いません。

于 2012-07-14T01:06:52.450 に答える