1

データベースに次のテーブルがあるとします

      A        B          C       D          E
    2009    db1234      12345   1234567     3000
    2010    db1235      34567   1234567     3100
    2011    cn2345      23456   2345678     2800
    2010    db1236      12345   1234567     3100
    2012    db1237      34567   1234567     2800 

テーブル AI で max 関数を実行すると、2012 になります。SQL では、クエリが A と対応する C 列の値、つまり 34567 を返すようにします。

4

1 に答える 1

4

集計関数が適用されている列の値とともに、対応する列の値を取得するには、その列でグループ化する必要があります。もう 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
于 2012-10-29T09:57:02.773 に答える