0Pricing
SQL Interview Prep · Lección

Contar y filtrar grupos

Encuentre los grupos que cumplen un umbral, como la pregunta clásica sobre clientes con más de N pedidos

Contar y filtrar grupos es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

La pregunta de agrupación más frecuente

«Encuentre los clientes con más de N pedidos» es el problema clásico de entrevistas sobre GROUP BY. Las variantes aparecen constantemente: productos vendidos más de X veces, departamentos con al menos Y empleados o días con más de Z inicios de sesión.

Todos siguen el mismo patrón: agrupar, contar y después filtrar los grupos con HAVING.

Paso uno: contar por grupo

Comience contando las filas dentro de cada grupo. Agrupe por la clave que define un «cliente» o un «producto» y, después, aplique COUNT(*).

Esto produce una fila por grupo con su tamaño. Todavía no ha filtrado nada; simplemente está midiendo cada grupo.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;

Paso dos: filtrar con HAVING

Ahora conserve únicamente los grupos que cumplen el umbral. La condición se basa en un agregado, por lo que debe estar en HAVING, no en WHERE.

Interprételo así: «agrupe los pedidos por cliente y, después, conserve los clientes cuyo recuento sea superior a cinco». Esta es la respuesta completa a la pregunta clásica.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;

COUNT DISTINCT frente a COUNT de todas las filas

Preste atención a la formulación. «Clientes que pidieron más de 3 productos diferentes» necesita COUNT(DISTINCT product_id), no COUNT(*).

  • COUNT(*) cuenta las filas del grupo.
  • COUNT(DISTINCT col) cuenta los valores únicos que no son NULL.

Los entrevistadores introducen «diferentes» o «únicos» en la pregunta para comprobar si utiliza DISTINCT.

SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;

Filtrar por SUM en lugar de COUNT

La misma estructura sirve para las sumas. «Clientes cuyo gasto total supere 1000» agrupa por cliente y filtra mediante SUM(amount).

Cualquier función de agregación puede determinar la condición de HAVING: COUNT, SUM, AVG, MAX o MIN. Identificar la medida que pide la pregunta le indica qué agregado debe utilizar para filtrar.

SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;

Varias condiciones de agrupación

HAVING puede combinar condiciones con AND/OR, incluso con distintos agregados. «Clientes con más de 5 pedidos Y un pedido medio superior a 100» se expresa en una sola cláusula HAVING.

Cada condición hace referencia a su propio agregado y todas se evalúan después de la agrupación. Esto demuestra que puede expresar reglas de negocio compuestas de forma clara.

SELECT customer_id,
       COUNT(*) AS orders,
       AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;

Combinar WHERE y HAVING

A menudo debe filtrar las filas antes de contarlas. «Entre los pedidos de este año, clientes con más de 5 pedidos» utiliza WHERE para la fecha y HAVING para el recuento.

WHERE reduce primero las filas; después se aplican la agrupación y el umbral de HAVING. Usar correctamente ambas cláusulas en una sola consulta demuestra un nivel intermedio.

SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;

Encontrar duplicados

Un caso muy relacionado es «encontrar correos electrónicos duplicados». Agrupe por la columna que debería ser única y conserve los grupos cuyo recuento sea superior a uno.

Este patrón sencillo detecta claves duplicadas, transacciones repetidas o cualquier valor que aparezca más veces de las debidas. Los entrevistadores lo plantean para comprobar si entiende la agrupación como herramienta de deduplicación.

SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Grupos que cumplen un recuento exacto

Los umbrales no siempre son «mayor que». «Clientes con exactamente un pedido» usa HAVING COUNT(*) = 1; «al menos 3» usa >= 3.

Preste atención a la palabra que marca el límite en el enunciado: «más de», «al menos», «exactamente», «menos de». Cada una corresponde a un operador de comparación distinto, y los entrevistadores evalúan esa precisión.

-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;

Devolver solo las claves

A veces el enunciado pide únicamente los identificadores que cumplen la condición, no los recuentos, a menudo para utilizarlos en otra consulta. Aun así, se agrupa y se filtra, pero se selecciona únicamente la clave.

A continuación, puede envolver esto en una subconsulta IN o en un JOIN para obtener los registros completos de esos clientes. Dominar esta composición demuestra experiencia avanzada.

SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;

Guía para entrevistas

Para cualquier pregunta sobre «grupos que cumplen un umbral», explique en voz alta estos cuatro pasos: (1) identifique la clave de agrupación, (2) elija la medida agregada, (3) determine el operador de comparación a partir del enunciado, (4) coloque los filtros de filas en WHERE y el filtro de agregación en HAVING.

Este patrón resuelve toda la familia de problemas de recuento y filtrado.

Comprobación rápida

Seleccione la consulta correcta para el enunciado.

Resumen

Patrón: agrupe por la clave, calcule una agregación y filtre los grupos con HAVING. Esto resuelve «más de N pedidos», «clientes que más gastan», duplicados y clientes con una sola compra.

  • Use COUNT(*) para las filas y COUNT(DISTINCT col) para los valores únicos.
  • Haga coincidir el operador de comparación con el enunciado.
  • Los filtros de filas van en WHERE; los filtros de agregación, en HAVING.
  • Seleccione únicamente la clave para utilizarla en una subconsulta IN o en un JOIN.

Preguntas frecuentes

¿La lección «Contar y filtrar grupos» es gratis?

Sí — el texto completo de «Contar y filtrar grupos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Contar y filtrar grupos»?

Encuentre los grupos que cumplen un umbral, como la pregunta clásica sobre clientes con más de N pedidos Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Contar y filtrar grupos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La regla de GROUP BY para las columnas de SELECT
  2. HAVING frente a WHERE
  3. Agrupar por varias columnas y expresiones
  4. Contar y filtrar grupos
← Volver a SQL Interview Prep