CodeGym /Cursos /SQL SELF /CTE sencillos para preparar datos: ejemplos y casos reale...

CTE sencillos para preparar datos: ejemplos y casos reales

SQL SELF
Nivel 27 , Lección 2
Disponible

CTE sencillos para preparar datos: ejemplos y casos reales

Parece que ya dominas lo básico de los CTE y, quizás, hasta escribes WITH casi en piloto automático. Hoy vamos a ir un poco más allá — y ver cómo usar CTE para preparar datos en situaciones reales. Imagina que vas a crear un informe o una consulta SQL compleja: primero hay que separar los ingredientes — y solo después cocinar una rica “sopa” analítica.

El CTE aquí es una herramienta genial para los pasos intermedios: filtrado, conteos, agregaciones, cálculo de medias — todo lo que necesitas para preparar los datos de forma lógica. Puedes dividir una consulta compleja en bloques lógicos claros, cada uno haciendo solo una cosa: seleccionar los registros necesarios, calcular la media o preparar los datos para la selección final. Esto hace que el código sea más fácil de leer, evita fragmentos repetidos y te permite no usar tablas temporales si no las necesitas.

El enfoque con CTE es especialmente útil cuando preparas datos para informes, construyes filtros complejos o quieres “limpiar” los datos antes de seguir procesando. En este sentido, el CTE no es solo un truco técnico, sino una estrategia completa — construyendo la lógica paso a paso, sin perder el control de lo que pasa.

¿Listo? Ahora vamos con los ejemplos.

Filtrado de datos usando CTE

El CTE es una forma genial de “sacar” los datos que necesitas de una tabla general, para luego trabajar solo con lo que realmente importa. En vez de escribir subconsultas enormes, primero filtras los datos, le das un nombre a ese paso — y luego trabajas con el resultado como si fuera una tabla normal.

Imagina que tenemos una tabla students, donde se guardan las notas de los estudiantes:

Tabla students

student_id first_name last_name grade
1 Otto Lin 87
2 Maria Chi 92
3 Alex Ming 79
4 Anna Song 95

Supón que quieres seleccionar a todos los que tienen una nota mayor que 85. Con CTE esto se hace súper claro:

WITH excellent_students AS (
    SELECT student_id, first_name, last_name, grade
    FROM students
    WHERE grade > 85
)
SELECT * FROM excellent_students;

Resultado:

student_id first_name last_name grade
1 Otto Lin 87
2 Maria Chi 92
4 Anna Song 95

¿Qué es lo cómodo aquí?

Ya seleccionaste las filas que te interesan y le diste un nombre a ese paso — excellent_students. Ahora puedes usar ese resultado más adelante: por ejemplo, unirlo con otra tabla, hacer otro filtrado o calcular la nota media. Todo es legible, simple y no te lía, sobre todo si la consulta es grande.

Agregación de datos usando CTE

Ahora vamos a un caso donde hay que contar registros o calcular medias. Por ejemplo, tenemos una tabla enrollments, donde se guardan los datos de qué estudiantes están inscritos en qué cursos.

Tabla enrollments

student_id course_id
1 101
2 102
3 101
4 103
2 101

Queremos saber cuántos estudiantes están inscritos en cada curso.

Ejemplo de consulta:

WITH course_enrollments AS (
    SELECT course_id, COUNT(student_id) AS student_count
    FROM enrollments
    GROUP BY course_id
)
SELECT * FROM course_enrollments;

Resultado:

course_id student_count
101 3
102 1
103 1

Aquí es importante:

  • Agrupamos los datos por course_id y contamos cuántos estudiantes hay en cada curso.
  • La tabla course_enrollments ahora tiene esa info, y puedes usarla para más análisis.

Preparación de datos para informes

Si necesitas montar un informe detallado, basado en varios pasos de procesamiento de datos, el CTE es un auténtico salvavidas. Te permite dividir toda la lógica en bloques claros y sin crear tablas temporales innecesarias. Imagina que tienes una tabla grades con notas y una tabla students con info de los estudiantes. Hay que hacer un informe donde solo estén los estudiantes con nota media mayor que 80.

Tabla grades

student_id grade
1 90
1 85
2 92
3 78
3 80
4 95

Tabla students

student_id first_name last_name
1 Otto Lin
2 Maria Chi
3 Alex Ming
4 Anna Song

En vez de una subconsulta gigante, puedes montar todo paso a paso:

WITH avg_grades AS (
    SELECT student_id, AVG(grade) AS avg_grade
    FROM grades
    GROUP BY student_id
    HAVING AVG(grade) > 80
),
students_with_grades AS (
    SELECT s.student_id, s.first_name, s.last_name, ag.avg_grade
    FROM students s
    JOIN avg_grades ag ON s.student_id = ag.student_id
)
SELECT * FROM students_with_grades;

En el primer paso (avg_grades) calculamos la nota media de cada estudiante y filtramos solo los que sacaron buenas notas — más de 80. En el segundo paso (students_with_grades) juntamos esos datos con la tabla students para tener nombres y apellidos. Así, el SELECT final devuelve una tabla lista para el informe — todo ya calculado, filtrado y bien presentado.

Resultado:

student_id first_name last_name avg_grade
1 Otto Lin 87.5
2 Maria Chi 92.0
4 Anna Song 95.0

Este enfoque es lo que hace tan cómodo el CTE: puedes centrarte en la lógica y la estructura, sin distraerte con cosas como crear y borrar tablas temporales.

Cálculo de métricas complejas

A veces toca combinar diferentes datos en una sola consulta. Por ejemplo, necesitamos calcular para cada curso:

  1. El número de estudiantes.
  2. La nota media del curso.

Ejemplo de consulta:

WITH course_counts AS (
    SELECT course_id, COUNT(student_id) AS student_count
    FROM enrollments
    GROUP BY course_id
),
course_avg_grades AS (
    SELECT e.course_id, AVG(g.grade) AS avg_grade
    FROM enrollments e
    JOIN grades g ON e.student_id = g.student_id
    GROUP BY e.course_id
)
SELECT cc.course_id, cc.student_count, cag.avg_grade
FROM course_counts cc
JOIN course_avg_grades cag ON cc.course_id = cag.course_id;

Errores que debes evitar

Trabajando con CTE, es fácil liarse y cometer un par de errores típicos.

El primero — materialización excesiva. Si creas demasiados CTE, PostgreSQL puede guardar sus resultados como tablas temporales, aunque solo los uses una vez. Al final, la consulta puede ir más lenta de lo que te gustaría.

El segundo error — aplicar mal los filtros. Si pones los filtros en el orden equivocado o en diferentes pasos de forma distinta, el resultado puede no ser el que esperabas. Por ejemplo, puedes filtrar datos importantes demasiado pronto sin querer.

Por eso, lo mejor es usar CTE cuando los datos pasan por varias transformaciones seguidas — ahí es donde esta herramienta muestra todo su potencial y te ayuda a escribir código limpio, claro y eficiente.

2
Tarea
SQL SELF, nivel 27, lección 2
Bloqueada
Selección de empleados con salario alto usando CTE
Selección de empleados con salario alto usando CTE
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION