Este artículo explora el operador SQL Count Distinct para eliminar las filas duplicadas en el conjunto de resultados.
Un desarrollador necesita obtener datos de una tabla SQL con múltiples condiciones. A veces, queremos obtener todas las filas de una tabla pero eliminar los valores NULL disponibles. Supongamos que queremos obtener registros de clientes distintos que hayan realizado un pedido el año pasado.
Sigamos adelante y tengamos una descripción general rápida de la función de recuento de SQL.
Función de recuento de SQL
Usamos la función agregada de recuento de SQL para obtener el número de filas La salida. Suponga que tenemos una tabla de productos que contiene registros de todos los productos vendidos por una empresa. Queremos saber el recuento de productos vendidos durante el último trimestre. Podemos usar la función SQL Count para devolver el número de filas en la condición especificada.
La sintaxis de la función SQL COUNT:
COUNT (expresión);
Por defecto, La función de recuento de SQL Server utiliza todas las palabras clave. Significa que SQL Server cuenta todos los registros de una tabla. También incluye las filas que tienen valores duplicados.
Creemos una tabla de muestra e insertemos algunos registros en ella.
En esta tabla, también tenemos valores duplicados y valores NULL .
En la siguiente captura de pantalla, podemos notar que:
- Count (* ) incluye valores duplicados y valores NULL
- Count (Col1) incluye valores duplicados pero no incluye valores NULL
Supongamos que queremos conocer los distintos valores disponibles en la tabla. Podemos usar SQL COUNT DISTINCT para hacerlo.
1
2
|
Seleccionar recuento (DISTINCT COL1)
de ## TestTable
|
En el siguiente resultado, obtenemos solo 2 filas. SQL COUNT Distinct no elimina los valores duplicados y NULL del conjunto de resultados.
Veamos otro ejemplo. En este ejemplo, tenemos una tabla de ubicación que consta de dos columnas Ciudad y Estado.
Ahora, ejecute la siguiente consulta para encontrar un recuento de la ciudad distinta de la tabla.
1
2
|
SELECT COUNT (DISTINCT (Ciudad))
FROM Location;
|
Devuelve el recuento de ciudad única 2 (Gurgaon y Jaipur) de nuestro conjunto de resultados.
Si miramos los datos, tenemos un nombre de ciudad similar presente en un estado también. La combinación de ciudad y estado es única, y no queremos que esa combinación única se elimine de la salida.
También podemos usar la función SQL DISTINCT en una combinación de columnas. Comprueba la combinación de valores y elimina si la combinación no es única.
1
2
|
SELECCIONE DISTINCT City, State
FROM Location;
|
No elimina los nombres de ciudades duplicados de la salida debido a una combinación única de valores.
Insertemos una fila más en la tabla de ubicación.
1
|
Insertar en valores de ubicación («Gurgaon «,» Haryana «)
|
Tenemos 5 registros en la tabla de ubicación. En los datos, puede ver que tenemos una combinación de ciudad y estado que no es única.
Vuelva a ejecutar SELECT DISTINCT función, y debería devolver solo 4 filas esta vez.
No podemos usar la función SQL COUNT DISTINCT directamente con las múltiples columnas . Obtiene el siguiente mensaje de error.
Podemos usar una tabla temporal para obtener registros de la función SQL DISTINCT y luego usar count (*) para comprobar los recuentos de filas.
1
2
3
4
|
SELECCIONE DISTINCT City, State
en #Temp
FROM Location;
Seleccionar recuento (*) de #Temp
|
Obtenemos el recuento de filas 4 en la salida.
Si usamos una combinación de columnas para obtener distintos valores y cualquiera de las columnas contiene valores NULL, también se convierte en una combinación única para SQL Server.
Para verificar esto, insertemos más registros en la tabla de ubicación. No especificamos ningún estado en esta consulta.
1
2
|
Insertar en valores de ubicación («Gurgaon», «»)
Insertar en valores de ubicación (ciudad) («Gurgaon»)
|
Veamos los datos de la tabla de ubicación.
Vuelva a ejecutar la consulta para diferenciar filas de la tabla de ubicación.
1
2
|
SELECCIONE una ciudad, estado distintos
DESDE la ubicación;
|
En la salida, podemos ver que no elimina la combinación de Ciudad y Estado con los valores en blanco o NULL.
De manera similar, puede ver el recuento de filas 6 con SQL COUNT Función DISTINCT.
Diferencia entre SELECT COUNT, COUNT (*) y SQL COUNT distinto
CONTAR |
Recuento (*) |
Count (Distinct) |
Devuelve el número total de filas después de satisfacer las condiciones especificadas en la cláusula where. |
Devuelve el número total de filas después de satisfacer las condiciones especificadas en la cláusula where. |
Devuelve el número distinto de filas después de satisfacer las condiciones especificadas en la cláusula where. . |
Da los recuentos de filas. No elimina los valores duplicados. |
Considera todas las filas independientemente de los valores NULL duplicados. |
Da un distinto número de filas después de eliminar los valores NULL y duplicados. |
Elimina los valores NULL en la salida. |
No elimina los valores NULL en la salida. |
Elimina los valores NULL en la salida. |
Plan de ejecución de la función distinta de recuento de SQL
Veamos el plan de ejecución real de la función de recuento de SQL DISTINCT. Debe habilitar el Plan de ejecución real desde la barra de menú de SSMS como se muestra a continuación.
Ejecute la consulta para obtener una plan de ejecución. En este plan de ejecución, puede ver los principales operadores que consumen recursos:
- Ordenar (Ordenar distinto) – Costo 78%
- Escaneo de tabla – Costo 22%
Puede colocar el mouse sobre el operador de clasificación y se abre una información sobre herramientas con los detalles del operador.
En las ventanas de propiedades, también obtenemos más detalles sobre el operador de clasificación, incluida la asignación de memoria, estadísticas y el número de filas.
En una tabla con millones de registros, SQL Count Distinct puede causar problemas de rendimiento porque un operador de count distinto es un operador costoso en el plan de ejecución real.
SQL Server 2019 mejora el rendimiento del operador SQL COUNT DISTINCT utilizando una nueva función Approx_count_distinct. Esta nueva función de SQL Server 2019 proporciona un recuento distinto aproximado de las filas. Puede haber una ligera diferencia en la salida de la función SQL Count Distintos y Approx_Count_distinct.
Puede reemplazar SQL COUNT DISTINCT con la palabra clave Approx_Count_distinct para usar esta función desde SQL Server 2019.
1
2
|
SELECCIONAR APROX_COUNT_DISTINCT (Ciudad)
DESDE la ubicación;
|
Puede explorar más sobre esta función en la nueva función de SQL Server 2019 Approx_Count_Distinct.
Conclusión
En este artículo, exploramos la función SQL COUNT con varios ejemplos. También cubrimos la nueva función de SQL Approx_Count_distinct disponible en SQL Server 2019. Sugeriría revisarlas según su entorno. Si tiene comentarios o preguntas, no dude en dejarlos en los comentarios a continuación.
- Autor
- Publicaciones recientes
Es el creador de una de las mayores colecciones de artículos en línea gratuitos sobre un solo tema, con su serie de 50 partes sobre los grupos de disponibilidad Always On de SQL Server. Basado en su contribución a la comunidad de SQL Server, ha sido reconocido con varios premios, incluido el prestigioso «Mejor autor del año» de forma continua en 2020 y 2021 en SQLShack.
Raj siempre está interesado en nuevos desafíos, así que si necesita consultoría ayuda sobre cualquier tema cubierto en sus escritos, puede ser contactado en [email protected]
Ver todas las publicaciones de Rajendra Gupta
- Tiempos de espera de sesión en SQL Server Always On Availability Grupos: 8 de febrero de 2021
- Realización de actualizaciones de versiones menores y mayores para AWS RDS SQL Server: 29 de enero de 2021
- Implementación de instancias de AWS RDS PostgreSQL: 27 de enero de 2021