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)