CodePráticov3.3.0
SQL

Como pegar o último registro de cada grupo em SQL

Use ROW_NUMBER para buscar o registro mais recente de cada cliente, matrícula, pedido ou outro grupo sem perder as demais colunas.

O problema

É comum precisar do último lançamento de cada cliente ou da movimentação mais recente de cada matrícula. MAX(data) encontra a maior data, mas não retorna automaticamente as outras colunas da mesma linha.

Solução com ROW_NUMBER()

WITH dados AS (
    SELECT
        p.*,
        ROW_NUMBER() OVER (
            PARTITION BY p.cliente_id
            ORDER BY p.data_pedido DESC, p.id DESC
        ) AS rn
    FROM pedidos p
)
SELECT *
FROM dados
WHERE rn = 1;

PARTITION BY reinicia a numeração para cada cliente. O ORDER BY coloca o registro mais recente em primeiro lugar.

Desempate é importante

Se duas linhas podem ter a mesma data, adicione um segundo critério estável, como o identificador:

ORDER BY data_movimento DESC, id DESC

Isso evita que o banco escolha arbitrariamente entre registros empatados.

Alternativa com MAX()

Quando você precisa somente da data mais recente, e não das demais colunas da linha, uma agregação simples pode ser suficiente.

SELECT cliente_id,
       MAX(data_pedido) AS ultima_data
FROM pedidos
GROUP BY cliente_id;