Seleccionar la primera fila de cada grupo, con ORDER BY más de una columna

Tengo una tabla T con columnas x , y , a , b tal que

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

me da la siguiente tabla

  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 

¿Cómo obtendría la primera fila de cada grupo x, y? Es decir, ¿cómo conseguiría la siguiente tabla?

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

Aquí hay un segundo ejemplo: para una tabla T tal que

  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 

Estoy esperando get

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

Teniendo en count SQL 2005 o superior:

 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 

De acuerdo con sus comentarios y la nueva estructura de la tabla, puede utilizar esta sencilla solución agnóstica de DBMS:

 SELECT ax,ay,aa,MIN(ab) b FROM T a JOIN ( SELECT x,y,MIN(a) a FROM T GROUP BY x,y ) b ON ax = bx AND ay = by AND aa = ba GROUP BY ax,ay,aa 

Demostración SQL-Fiddle

Aquí hay una solución de Oracle muy eficiente

 select x, y, min(a) as a, min(b) keep( dense_rank first order by a) as b from T group by x,y 

por favor intente esto y hágamelo saber

 select x,y,MIN(a) a,MIN(b) b from T group by X,y