集計関数が適用されている列の値とともに、対応する列の値を取得するには、その列でグループ化する必要があります。もう 1 つのアプローチは、分析関数の 1 つを使用することです。row_number()またはrank( ) のいずれかで動作が異なりますが、特定の状況下では同じ結果が得られる場合があります。以下にいくつかの例を示します。
SQL> with t1 (A, B, C, D, E) as(
2 select 2009, 'db1234', 12345, 1234567, 3000 from dual union all
3 select 2010, 'db1235', 34567, 1234567, 3100 from dual union all
4 select 2011, 'cn2345', 23456, 2345678, 2800 from dual union all
5 select 2010, 'db1236', 12345, 1234567, 3100 from dual union all
6 select 2012, 'db1237', 34567, 1234567, 2800 from dual
7 )
8 select max(a) maxa
9 , c
10 from t1
11 group by c
12 order by 1
13 ;
結果:
MAXA C
---------- ----------
2010 12345
2011 23456
2012 34567
最初の行だけを返したい場合 (順序が重要です)、rownum
疑似列を使用して結果をフィルタリングできます。
SQL> with t1 (A, B, C, D, E) as(
2 select 2009, 'db1234', 12345, 1234567, 3000 from dual union all
3 select 2010, 'db1235', 34567, 1234567, 3100 from dual union all
4 select 2011, 'cn2345', 23456, 2345678, 2800 from dual union all
5 select 2010, 'db1236', 12345, 1234567, 3100 from dual union all
6 select 2012, 'db1237', 34567, 1234567, 2800 from dual
7 )
8 select *
9 from (select max(a) maxa
10 , c
11 from t1
12 group by c
13 order by 1 desc
14 )
15 where rownum = 1
16 ;
結果:
MAXA C
---------- ----------
2012 34567
2番目のアプローチは、row_number
分析機能を使用することです。
SQL> with t1 (A, B, C, D, E) as(
2 select 2009, 'db1234', 12345, 1234567, 3000 from dual union all
3 select 2010, 'db1235', 34567, 1234567, 3100 from dual union all
4 select 2011, 'cn2345', 23456, 2345678, 2800 from dual union all
5 select 2010, 'db1236', 12345, 1234567, 3100 from dual union all
6 select 2012, 'db1237', 34567, 1234567, 2800 from dual
7 )
8 select a
9 , b
10 , c
11 , d
12 , e
13 from (select a
14 , b
15 , c
16 , d
17 , e
18 , row_number() over(partition by c order by a desc) rn
19 from t1
20 )
21 where rn = 1
22 ;
結果:
A B C D E
---------- ------ ---------- ---------- ----------
2010 db1236 12345 1234567 3100
2011 cn2345 23456 2345678 2800
2012 db1237 34567 1234567 2800
どの列でもグループ化したくない場合は、同様のクエリを作成できます (ここではmax
関数の分析バージョンが使用されます)。
SQL> with t1 (A, B, C, D, E) as(
2 select 2009, 'db1234', 12345, 1234567, 3000 from dual union all
3 select 2010, 'db1235', 34567, 1234567, 3100 from dual union all
4 select 2011, 'cn2345', 23456, 2345678, 2800 from dual union all
5 select 2010, 'db1236', 12345, 1234567, 3100 from dual union all
6 select 2012, 'db1237', 34567, 1234567, 2800 from dual
7 )
8 select *
9 from(select a
10 , b
11 , c
12 , d
13 , e
14 , max(a) over() mx
15 from t1
16 ) q
17 where q.a = q.mx
18 ;
結果:
A B C D E MX
---------- ------ ---------- ---------- ---------- ----------
2012 db1237 34567 1234567 2800 2012