SQL Server从一组中选择第一行

86

我有这样一个表格:

a          b
1          23
1          2
1          7
2          9
2          11

我想从一个"GROUP BY a"的查询结果中选择第一行(顺序不重要),结果应该是:

a          b
1          23
2          9

我正在使用 SQL SERVER 2008,如何编写此查询?


1
那么(1,2),(2,11)也可以接受,因为顺序无关紧要?(或任何其他任意的b值每个a - Martin Smith
是的,我只需要一行,不论它是什么。 - Rn2dy
这个回答解决了你的问题吗?[在每个GROUP BY组中选择第一行?] (https://dev59.com/Wm865IYBdhLWcg3wduaH) - Michael Freidgeim
这个回答解决了你的问题吗?获取每个分组的前1行 - Michael Freidgeim
2个回答

150

7
当每个分组中仅有一列值可提取时(就像这里),最简单的方法是使用MINMAX函数(你的示例等同于只选择MAX(b))。当然,对于更多的列,使用其他方法则更加合理。 - Damien_The_Unbeliever
虽然查询看起来很复杂,但是它提供了选择多列的灵活性。 - Ankur Arora
即使您的列不是数值型,MAX/MIN 也能正常工作;-) - Mauricio Gracia Gutierrez

82

如果像你所说的那样,顺序不重要,那么在b上使用任何一个聚合函数都是可以的。

使用MIN函数的例子

SELECT a, b = MIN(b)
FROM   YourTable
GROUP BY
       a

1
谢谢Lieven,但这只选择了一个特定的值。如果有更多的列,我们需要选择整个行(正如标题所说),该怎么办? - dpelisek
1
@dpelisek - 一个典型的解决方案是为每一行添加一个行号,该行号由你想要分组的列进行分区,并仅选择行号等于1的行。我已经设置了一个SQL Fiddle来展示意图。编辑<傻眼>,我真的应该先阅读其他答案。Remi发布了类似的内容。 - Lieven Keersmaekers
3
这是错误的。解决方案找到的是最小值而不是第一个值。上面的评论更好。 - Matte
1
@Matte - 是的,但顺序并不重要。OP应该重新阐述问题。任何b的任意值都可以(根据评论为OP)。 - Lieven Keersmaekers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接