簡體   English   中英

SQL選擇列,另一列中的最大值

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

cross apply()版本:

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;

top with ties版本:

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.

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