簡體   English   中英

SQL檢索最大值加上相應的另一個列值

[英]SQL retrieving max value plus corresponding another column value

假設我的數據庫中有以下表格

      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將獲得2012.我希望查詢返回A和相應的C列值,即34567,在SQL中。

要獲取相應列的值以及要應用聚合函數的列的值,您需要按該列進行分組。 另一種方法是使用其中一個分析函數 ,無論是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM