gpt4 book ai didi

sql - 在 T/SQL 中如何按一列分组并检索具有另一列最小值的行?

转载 作者:行者123 更新时间:2023-12-02 07:52:01 24 4
gpt4 key购买 nike

所以我知道这是一个非常愚蠢的问题,但是(正如相当长的标题所说)我想知道如何执行以下操作:

我有一个这样的表:

ID Foo Bar Blagh
----------------
1 10 20 30
2 10 5 1
3 20 50 40
4 20 75 12

我想按 Foo 分组,然后取出具有最小 Bar 的行,即我想要以下内容:

ID Foo Bar Blagh
----------------
2 10 5 1
3 20 50 40

我一辈子都无法找出正确的 SQL 来检索它。我想要这样的东西:

SELECT ID, Foo, Bar, Blagh
FROM Table
GROUP BY Foo
HAVING(MIN(Bar))

但是这显然不起作用,因为 HAVING 语法和 ID 完全无效,Foo、Bar 和 Blagh 没有聚合。

我做错了什么?

最佳答案

This几乎是完全相同的问题,但它有一些答案!

这是我模拟你的 table :

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

编辑 Adam Robinson 很有帮助地指出,“当 Bar 的最小值重复时,此解决方案有可能返回多行,并消除 bar 为 null 的 foo 的任何值”

根据您的用例,Bar 重复的重复值可能是有效的 - 如果您想查找 Borg 中 Bar 最小的所有值,那么拥有这两个结果似乎是可行的方法。

如果需要捕获NULLs在您要聚合的字段中(在本例中为 MIN),那么您可以 coalesce具有可接受的高(或低)值的 NULL(这是一个 hack):

...
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 分组值,因为它不知道如何在它们之间进行选择。

关于sql - 在 T/SQL 中如何按一列分组并检索具有另一列最小值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com