Этот - почти тот же вопрос, но на него есть ответы!
Вот я издеваюсь над вашим столом:
declare @Borg table (
ID int,
Foo int,
Bar int,
Blagh int
)
insert into @Borg values (1,10,20,30)
insert into @Borg values (2,10,5,1)
insert into @Borg values (3,20,50,70)
insert into @Borg values (4,20,75,12)
Затем вы можете выполнить анонимное внутреннее объединение, чтобы получить нужные данные.
select B.* from @Borg B inner join
(
select Foo,
MIN(Bar) MinBar
from @Borg
group by Foo
) FO
on FO.Foo = B.Foo and FO.MinBar = B.Bar
РЕДАКТИРОВАТЬ Адам Робинсон услужливо указал, что «это решение может возвращать несколько строк, когда минимальное значение Bar дублировано, и устраняет любое значение foo, где bar равно null
»
В зависимости от вашего сценария использования, допустимы повторяющиеся значения, в которых дублируется Бар, - если вы хотите найти все значения в Борге, где Бар был минимальным, тогда кажется, что иметь оба результата - путь.
Если вам нужно захватить NULLs
в поле, по которому вы агрегируете (в данном случае MIN), вы можете coalesce
NULL с приемлемо высоким (или низким) значением (это хак) :
...
MIN(coalesce(Bar,1000000)) MinBar -- A suitably high value if you want to exclude this row, make it suitably low to include
...
Или вы можете пойти на UNION и прикрепить все такие значения к нижней части вашего набора результатов.
on FO.Foo = B.Foo and FO.MinBar = B.Bar
union select * from @Borg where Bar is NULL
Последний не будет группировать значения в @Borg с одинаковым значением Foo
, потому что не знает, как выбирать между ними.