Saltar al contenido

El día que entendí ROW_NUMBER() dejé de sufrir con los 'top N por grupo'

Marcos A.

Nivel 3 ·

Durante años resolvía 'el último pedido de cada cliente' con subconsultas correlacionadas horribles. Hasta que aprendí funciones de ventana: SELECT * FROM ( SELECT p.*, ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY fecha DESC) AS rn FROM pedidos p ) t WHERE rn = 1; Si alguien todavía no las usa, se las recomiendo.
246 vistas 6 respuestas 1 0

Respuestas 6

  1. Alan R.

    Nivel 3 ·

    1 0

    Las funciones de ventana son de lo mejor del SQL moderno. Cuando entendés PARTITION BY ya no volvés atrás.

  2. camila M.

    Nivel 2 ·

    0 0

    Ojo con los empates: si dos pedidos tienen la misma fecha, ROW_NUMBER elige uno arbitrario. Si querés todos los empatados, usá RANK() o DENSE_RANK().

  3. Gabriel B.

    Nivel 3 ·

    0 0

    En Postgres, para este caso puntual, también existe DISTINCT ON (cliente_id) con ORDER BY cliente_id, fecha DESC. Más corto, aunque no es estándar.

  4. Bautista F.

    Nivel 2 ·

    0 0

    Mis favoritas: LAG y LEAD para comparar una fila con la anterior. Diferencia de ventas mes a mes en una línea.

  5. Ana R.

    Nivel 3 ·

    0 0

    Y SUM() OVER (ORDER BY fecha) para acumulados. Antes hacía eso en Excel jaja

  6. Lorena M.

    Nivel 3 ·

    1 0

    Gracias por el ejemplo, justo tenía este problema en un reporte.