84

I have table like this:

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

I want to select the first row(order does not matter) from a "GROUP BY a" query , the result should be

a          b
1          23
2          9

I am using SQL SERVER 2008 how to write the query for this?

Mateen Ulhaq
  • 24,552
  • 19
  • 101
  • 135
Rn2dy
  • 4,112
  • 12
  • 43
  • 59

2 Answers2

150
select a,b
from (
select a,b,row_number() over(partition by a order by b desc) as roworder
from myTable
) temp
where roworder = 1

see http://msdn.microsoft.com/en-us/library/ms186734.aspx

remi bourgarel
  • 9,231
  • 4
  • 40
  • 73
81

If as you indicated, order doesn't matter, any aggregate function on b would be sufficient.

Example Using MIN

SELECT a, b = MIN(b)
FROM   YourTable
GROUP BY
       a
Lieven Keersmaekers
  • 57,207
  • 13
  • 112
  • 146
  • 1
    Thank you Lieven, but this selects only one particular value. What if there were more columns and we need to select whole ROW (as the title says)? – dpelisek Feb 13 '14 at 16:51
  • 1
    @dpelisek - A typical solution would be to add a rownumber to each row partitioned by the column(s) you want to group on and only select the ones where the rownumber equals 1. I have setup an [SQL Fiddle](http://www.sqlfiddle.com/#!6/b1588/3) to show the intent. **Edit** , I really should read other answers first. Remi posted something similar. – Lieven Keersmaekers Feb 14 '14 at 06:44
  • 3
    This is wrong. The solution finds the MIN and not the FIRST. The comment here above is much better. – Matte Jan 08 '16 at 15:16
  • 1
    @Matte - True but the order doesn't matter. OP should have restated the question. Any arbitrary value of b will do *(for OP as per comments)* – Lieven Keersmaekers Jan 08 '16 at 21:18