Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting the first row from each group, with ORDER BY more than one column

I have a table T with columns x,y,a,b such that

SELECT x,y,a,b FROM T
ORDER BY x,y,a,b

gives me the following table

 x    | y    | a    | b
 x1   | y1   | a1   | b1
 x1   | y1   | a1   | b2
 x1   | y1   | a2   | b1
 x1   | y2   | a1   | b1
 x1   | y2   | a1   | b2
 x1   | y2   | a2   | b1

How would I get the first row of each x,y group? That is, how would I get the following table

 x    | y    | a    | b
 x1   | y1   | a1   | b1
 x1   | y2   | a1   | b1

Here is a second example: For a table T such that

 x    | y    | a    | b
 x1   | y1   | a1   | b3
 x1   | y1   | a1   | b4
 x1   | y1   | a2   | b1
 x1   | y1   | a2   | b2
 x1   | y2   | a1   | b3
 x1   | y2   | a1   | b4
 x1   | y2   | a2   | b1
 x1   | y2   | a2   | b2

I am expecting to get

 x    | y    | a    | b
 x1   | y1   | a1   | b3
 x1   | y2   | a1   | b3
like image 224
Daniel Vaca Avatar asked Dec 15 '22 21:12

Daniel Vaca


2 Answers

Considering SQL 2005 or Above:

SELECT T1.X,
       T1.Y,
       T1.A,
       T1.B
  FROM
      (SELECT X,
              Y,
              A,
              B,
              ROW_NUMBER() OVER (Partition BY X,Y Order By A,B) AS RowNum
         FROM T
     ) T1
WHERE T1.RowNum = 1
like image 164
Nitin Midha Avatar answered Dec 18 '22 10:12

Nitin Midha


As per your comments and new table structure, you can use this simple DBMS-agnostic solution:

SELECT a.x,a.y,a.a,MIN(a.b) b
FROM T a
JOIN ( SELECT x,y,MIN(a) a FROM T GROUP BY x,y ) b ON
    a.x = b.x AND
    a.y = b.y AND
    a.a = b.a
GROUP BY a.x,a.y,a.a

SQL-Fiddle Demo

like image 41
Zane Bien Avatar answered Dec 18 '22 10:12

Zane Bien