Objetivo
Analizar filas manteniendo el detalle.
Explicación
Una window function calcula sobre un conjunto relacionado sin colapsarlo como GROUP BY. PARTITION BY define grupos lógicos; ORDER BY dentro de OVER define secuencia. En un equipo de datos, SQL no se evalúa sólo por devolver filas: debe responder una pregunta de negocio, conservar el grain correcto y permitir que otra persona valide el resultado. Esta práctica usa el ecommerce del curso para obligarte a reconciliar conteos y totales, igual que harías antes de publicar una métrica en un dashboard. Para trabajar Window functions: ROW_NUMBER, LAG y acumulados de forma profesional, no te quedes con el ejemplo: identifica la entrada, ejecuta el caso base, provoca al menos un caso incorrecto y compara el resultado con un control independiente. En este laboratorio el criterio de salida es concreto: Cada pedido conserva su fila y añade métricas de contexto. La verificación principal será: Para cada cliente, order_number empieza en 1 y crece sin saltos. Si no puedes explicar por qué pasa esa comprobación, vuelve al paso anterior antes de continuar.
Contexto profesional
En un equipo de datos, SQL no se evalúa sólo por devolver filas: debe responder una pregunta de negocio, conservar el grain correcto y permitir que otra persona valide el resultado. Esta práctica usa el ecommerce del curso para obligarte a reconciliar conteos y totales, igual que harías antes de publicar una métrica en un dashboard.
Ejemplo real
SELECT customer_id,order_date,amount,
ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date) AS order_number,
LAG(amount) OVER(PARTITION BY customer_id ORDER BY order_date) AS previous_amount
FROM orders;
Archivos o datos de entrada
- data/ecommerce_customers.csv
- data/ecommerce_orders.csv
Práctica guiada
Numera pedidos por cliente y calcula diferencia con el anterior.
Laboratorio paso a paso
- Prepara el entorno y localiza los datos/archivos de entrada: data/ecommerce_customers.csv, data/ecommerce_orders.csv. Antes de modificar nada, anota el número de filas, columnas u objetos que esperas usar.
- Reproduce el ejemplo real de la lección y guarda la salida. No avances hasta poder explicar qué hace cada bloque relacionado con «Window functions: ROW_NUMBER, LAG y acumulados».
- Ejecuta la práctica guiada: Numera pedidos por cliente y calcula diferencia con el anterior. Documenta el comando, consulta o acción exacta y el resultado obtenido.
- Resuelve el reto sin mirar la solución: Obtén el primer y último pedido de cada cliente usando ventanas. Si falla, registra el mensaje de error y formula una hipótesis antes de cambiar código.
- Compara tu resultado con el criterio esperado: Cada pedido conserva su fila y añade métricas de contexto. Después ejecuta la comprobación: Para cada cliente, order_number empieza en 1 y crece sin saltos.
- Provoca deliberadamente un caso problemático relacionado con este error frecuente: Omitir ORDER BY hace que “primero” no tenga un significado estable.. Comprueba que sabes detectarlo y corregirlo.
Reto sin ayuda
Obtén el primer y último pedido de cada cliente usando ventanas.
Resultado esperado
Cada pedido conserva su fila y añade métricas de contexto.
Cómo verificarlo
Para cada cliente, order_number empieza en 1 y crece sin saltos.
Checklist de validación
- El resultado cumple: Cada pedido conserva su fila y añade métricas de contexto.
- Has ejecutado esta verificación y puedes explicar el resultado: Para cada cliente, order_number empieza en 1 y crece sin saltos.
- Has probado al menos un caso límite o dato inválido y el comportamiento es explícito, no silencioso.
- Puedes repetir la práctica desde cero sin copiar la solución y dejar evidencia (consulta, commit, captura o salida de consola).
Pista específica
ROW_NUMBER sirve para seleccionar una fila concreta por partición.
Solución paso a paso
1) Empieza reproduciendo el caso base con los datos indicados. 2) Aplica esta estrategia específica: Usa ORDER BY ASC para primero y DESC para último; en Snowflake puedes filtrar con QUALIFY. 3) Usa como referencia técnica el ejemplo de la lección (SELECT customer_id,order_date,amount, ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date) AS order_number, LAG(amount) OVER(PARTITION BY customer_id ORDER BY order_date) AS previous_amount FROM orders;). 4) Ejecuta la verificación: Para cada cliente, order_number empieza en 1 y crece sin saltos. 5) Compara con el resultado esperado: Cada pedido conserva su fila y añade métricas de contexto. 6) Repite el reto cambiando un dato o condición para demostrar que entiendes el comportamiento y no has obtenido el resultado por casualidad. Si aparece el error «Omitir ORDER BY hace que “primero” no tenga un significado estable.», corrige la causa antes de continuar; no ocultes el fallo ni cambies el resultado esperado para que la prueba pase.
Errores frecuentes
- Omitir ORDER BY hace que “primero” no tenga un significado estable.
Qué debes recordar
Debes poder explicar qué filas produce la consulta y por qué.
Preguntas de entrevista
- ¿Cómo demostrarías que una consulta no está duplicando métricas? Aplícalo concretamente a «Window functions: ROW_NUMBER, LAG y acumulados».
- ¿Qué comprobaciones harías antes de publicar este resultado a negocio? Explica qué evidencia enseñarías al revisor.
Siguiente paso
Aplicarás QUALIFY y deduplicación.
Recursos de esta lección
Preparando contenido…
Quiz de la lección
¿Qué diferencia principal hay entre GROUP BY y una ventana?