2012-10-29 31 views
1

假設我有以下表中的另一列值SQL檢索最大值加在我的數據庫相應

 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 

如果我這樣做對錶max函數AI將獲得2012 我想查詢返回A和相應的C柱值即34567,在SQL中。

回答

4

要獲取相應列的值以及要應用聚合函數的列的值,您需要按該列進行分組。另一種方法是使用analytic functions之一,不管它是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 

第二種方法是使用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 
+0

當然,如果只需要一行(包含最大值的行),則不需要執行聚合(在這種情況下)。您可以通過'a DESC'排序獲取最頂端的行。除此之外,這是一個非常好的解答,+1 –

相關問題