[英]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.