[英]SQL Select column with maximum value in another column
我有一個看起來像這樣的表:
Name Group Value
A 1 0
B 1 2
C 1 5
D 2 6
E 2 0
F 3 3
我想選擇每個組中具有最大值的名稱。 例如,有3個組,因此結果將是:
Name
C (because it has the maximum value (5) within group 1)
D (because it has the maximum value (6) within group 2)
F (because it has the maximum value (3) within group 3)
我試圖寫這樣的事情:
SELECT name FROM table
WHERE value = (SELECT max(value) FROM table)
GROUP BY group
但是max(value)返回整個表的全局最大值(例如本示例中的(6))。 我該如何解決?
你有點親密。 您需要一個相關的子查詢,而不是外部查詢中的聚合:
SELECT t.*
FROM table t
WHERE value = (SELECT max(t2.value) FROM table t2 WHERE t2.group = t.group);
這是標准的SQL,可在任何數據庫中使用。 您只需要選擇name
即可,但是我認為該group
也很有用。
在大多數數據庫中,您將為此目的使用row_number()
。
在SQL Server中,更典型的做法是:
select t.*
from (select t.*,
row_number() over (partition by group order by value desc) as seqnum
from t
) t
where seqnum = 1;
如果有平局(最大),則返回恰好一行(通常是所希望的)。 如果要所有此類行,請改用rank()
或dense_rank()
。
有很多方法可以做到這一點,其中有一些:
所有這些都使用rextester: http ://rextester.com/DTWB67044
max()
over()
版本:
with cte as (
select *, MaxValue = max([Value]) over (partition by [Group])
from t
)
select Name
from cte
where [Value] = MaxValue;
inner join
版本:
select t.Name
from t
inner join (
select MaxValue=max(value), [Group]
from t
group by [Group]
) as m
on t.[Group] = m.[Group]
and t.[Value] = m.MaxValue;
select t.Name
from t
cross apply (
select top 1
[Value]
from t as i
where i.[Group] = t.[Group]
order by i.[Value] desc
) as x
where t.[Value] = x.[Value];
如果每個組只返回一個值,那么這些也可以工作:
帶有row_number()
版本的公用表表達式 :
with cte as (
select *, rn = row_number() over (partition by [Group] order by [Value] desc)
from t
)
select Name
from cte
where rn = 1;
select top 1 with ties
t.Name
from t
order by row_number() over (partition by [Group] order by [Value] desc);
這將為您提供所需的輸出。
Select name, max(value) from table group by group order by group
輸出:
C | 5
D | 6
F | 3
戈登的解決方案appliead從一個例子user3685285 :
SELECT t.Name FROM table t WHERE Value = (SELECT max(tt.Value) FROM table tt WHERE tt.Group = t.Group);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.