简单查询以获取每个ID的最大值

Nic*_*nas 19 sql sql-server max greatest-n-per-group

好的,我有一个这样的表:

ID     Signal    Station    OwnerID
111     -120      Home       1
111     -130      Car        1
111     -135      Work       2
222     -98       Home       2
222     -95       Work       1
222     -103      Work       2
Run Code Online (Sandbox Code Playgroud)

这一切都在同一天.我只需要Query来返回每个ID的最大信号:

ID    Signal    Station    OwnerID
111   -120      Home        1
222   -95       Work        1
Run Code Online (Sandbox Code Playgroud)

我尝试使用MAX()和聚合混乱,每个记录的Station和OwnerID都不同.我需要加入吗?

And*_*mar 20

像这样的东西?自己加入表格,并排除找到更高信号的行.

select cur.id, cur.signal, cur.station, cur.ownerid
from yourtable cur
where not exists (
    select * 
    from yourtable high 
    where high.id = cur.id 
    and high.signal > cur.signal
)
Run Code Online (Sandbox Code Playgroud)

这将为每个最高信号列出一行,因此每个id可能有多行.


bob*_*nce 15

您正在进行分组最大/最小操作.这是一个常见的陷阱:它感觉像是应该很容易做的事情,但在SQL中它更加严重.

该问题有许多方法(标准ANSI和特定于供应商),其中大多数在许多情况下都是次优的.当多行共享相同的最大/最小值时,有些会给你多行; 有些人不会.有些人在有少量团体的桌子上工作得很好; 对于每组具有较小行数的大量组,其他更有效.

以下是对一些常见问题的讨论(MySQL偏见但普遍适用).就个人而言,如果我知道没有多个最大值(或者不关心获取它们),我常常倾向于使用null-left-self-join方法,我将发布为其他人尚未发布的方法:

SELECT reading.ID, reading.Signal, reading.Station, reading.OwnerID
FROM readings AS reading
LEFT JOIN readings AS highersignal
    ON highersignal.ID=reading.ID AND highersignal.Signal>reading.Signal
WHERE highersignal.ID IS NULL;
Run Code Online (Sandbox Code Playgroud)