Consulta de Firebird- Devuelve la primera fila de cada grupo

En una database Firebird con una tabla "Ventas", necesito seleccionar la primera venta de todos los clientes. Vea a continuación una muestra que muestra la tabla y el resultado deseado de la consulta.

--------------------------------------- SALES --------------------------------------- ID CUSTOMERID DTHRSALE 1 25 01/04/16 09:32 2 30 02/04/16 11:22 3 25 05/04/16 08:10 4 31 07/03/16 10:22 5 22 01/02/16 12:30 6 22 10/01/16 08:45 

Resultado: solo primera venta, en function de la date de venta.

 ID CUSTOMERID DTHRSALE 1 25 01/04/16 09:32 2 30 02/04/16 11:22 4 31 07/03/16 10:22 6 22 10/01/16 08:45 

Ya probé el siguiente código "¿ Seleccionar la primera fila en cada grupo GROUP BY? ", Pero no funcionó.

En Firebird 2.5 puede hacer esto con la siguiente consulta; esta es una modificación menor de la segunda parte de la respuesta aceptada de la pregunta que ha vinculado a medida de su esquema y requisitos:

 select x.id, x.customerid, x.dthrsale from sales x join (select customerid, min(dthrsale) as first_sale from sales group by customerid) p on p.customerid = x.customerid and p.first_sale = x.dthrsale order by x.id 

No es necesario el order, simplemente lo agregué para que dé la order que se muestra en su pregunta.

Con Firebird 3 puede usar la function de window ROW_NUMBER que también se describe en la respuesta vinculada. La respuesta vinculada decía incorrectamente que la primera solución funcionaría en Firebird 2.1 y superior. Ahora lo he editado.

Busque las ventas sin ventas anteriores:

 SELECT S1.* FROM SALES S1 LEFT JOIN SALES S2 ON S2.CUSTOMERID = S1.CUSTOMERID AND S2.DTHRSALE < S1.DTHRSALE WHERE S2.ID IS NULL 

Defina un índice sobre (customerid, dthrsale) para hacerlo rápido.

Tan simple como:

select CUSTOMERID min (DTHRSALE) del grupo VENTAS por CUSTOMERID