SQL Window
-- Top N por categoría
SELECT *
FROM (
SELECT c.*, ROW_NUMBER() OVER (PARTITION BY categoria ORDER BY monto DESC) rn
FROM compras c
) t
WHERE rn <= 3;
-- LAG / LEAD
SELECT id, fecha, monto,
LAG(monto) OVER (PARTITION BY id ORDER BY fecha) AS prev_monto,
LEAD(monto) OVER (PARTITION BY id ORDER BY fecha) AS next_monto
FROM pagos;