¿Cómo hacer una consulta SQL para la última transacción de cada count?

Digamos que tengo una tabla de "transactions" que tiene las columnas "acct_id" "trans_date" y "trans_type" y quiero filtrar esta tabla para que tenga solo la última transacción para cada count. Claramente podría hacer algo como

SELECT acct_id, max(trans_date) as trans_date FROM transactions GROUP BY acct_id; 

pero luego pierdo mi trans_type. Podría hacer una segunda llamada SQL con mi list de dates y las identificaciones de count y recuperar mi trans_type, pero eso me parece muy complicado, ya que significa enviar datos de ida y vuelta al server sql o crear una tabla temporal.

¿Hay alguna manera de hacer esto con una sola consulta, con suerte un método genérico que funcionaría con mysql, postgres, sql-server y Oracle?

Este es un ejemplo de una consulta de mayor n por grupo . Esta pregunta aparece varias veces por semana en StackOverflow. Además de las soluciones de subconsulta brindadas por otras personas, esta es mi solución preferida, que no utiliza subconsulta, GROUP BY o CTE:

 SELECT t1.* FROM transactions t1 LEFT OUTER JOIN transactions t2 ON (t1.acct_id = t2.acct_id AND t1.trans_date < t2.trans_date) WHERE t2.acct_id IS NULL; 

En otras palabras, devuelva una fila de manera que no exista otra fila con el mismo acct_id y una mayor trans_date .

Esta solución asume que trans_date es único para una count determinada, de lo contrario, pueden producirse vínculos y la consulta devolverá todas las filas atadas. Pero esto es cierto para todas las soluciones dadas por otras personas también.

Prefiero esta solución porque casi siempre trabajo en MySQL, lo que no optimiza GROUP BY muy bien. Entonces, esta solución de combinación externa suele ser mejor para el performance.

Esto funciona en SQL Server …

 SELECT acct_id, trans_date, trans_type FROM transactions a WHERE trans_date = ( SELECT MAX( trans_date ) FROM transactions b WHERE a.acct_id = b.acct_id ) 
 select t.acct_id, t.trans_type, tm.trans_date from transactions t inner join ( SELECT acct_id, max(trans_date) as trans_date FROM transactions GROUP BY acct_id; ) tm on t.acct_id = tm.acct_id and t.trans_date = tm.trans_date 

Prueba esto

 WITH LastTransaction AS ( SELECT acct_id, max(trans_date) as trans_date FROM transactions GROUP BY acct_id ), AllTransactions AS ( SELECT acct_id, trans_date, trans_type FROM transactions ) SELECT * FROM AllTransactions INNER JOIN AllTransactions ON AllTransactions.acct_id = LastTransaction.acct_id AND AllTransactions.trans_date = LastTransaction.trans_date