Colas largas
Las colas largas se refieren a pequeños recuentos que ocurren muchas veces. Cuando las graficamos, forman una delgada franja a la derecha que parece una cola. Indican la presencia de valores atípicos que pueden ser de interés.
En el contexto de las ejecuciones en Texas, la “cola larga” se refiere a un pequeño número de condados que han realizado muchas ejecuciones.
Encontraremos el porcentaje de ejecuciones por condado para identificar los del extremo de la cola.
Como será cada vez más evidente, la forma de las tablas nos indica mucho sobre las operaciones que necesitamos realizar (esto es análogo al análisis dimensional en física). En este caso, podemos ver que los métodos vistos hasta ahora son insuficientes: el capítulo Beazley trató operaciones a nivel de fila, pero aquí necesitamos agregar para obtener datos por condado. El capítulo Claims of Innocence nos enseñó la agregación, pero esas funciones producirían una sola fila cuando en realidad queremos una fila por condado.
El bloque GROUP BY
Aquí es donde entra GROUP BY. Nos permite dividir el conjunto de datos y aplicar funciones de agregación dentro de cada grupo, produciendo una fila por grupo. Su forma básica es GROUP BY <column>, <column>, ... y va después del bloque WHERE.
Si recuerdas Una consulta extraña, te sonarán las alarmas: ¿no aprendimos a no mezclar columnas agregadas y no agregadas? La diferencia aquí es que las columnas por las que agrupar son las únicas permitidas como no agregadas. Todas las filas del grupo comparten el mismo valor en esas columnas, así que no hay ambigüedad.
Quizá también hayas notado el uso de AS. Es lo que llamamos “alias”. En el bloque SELECT, <expression> AS <alias> da un alias que podemos referenciar más adelante. Ahorramos reescribir expresiones largas y aclaramos el propósito.
El bloque HAVING
El siguiente ejercicio ilustra que filtrar con WHERE ocurre antes de agrupar y agregar. Esto se refleja en el orden sintáctico: WHERE precede siempre a GROUP BY.
¿Qué ocurre si queremos filtrar por el resultado de la agregación? No podemos mirar al futuro. Para eso usamos HAVING.
Práctica
Este quiz está diseñado para desafiar tu comprensión. Lee las explicaciones aunque aciertes.
Consultas anidadas
En apariencia podríamos querer algo como:
SELECT
county,
PERCENT_COUNT(*)
FROM executions
GROUP BY county
¿No sería útil una función así? No existe porque requeriría agregar dentro de grupos (numerador) y en toda la tabla (denominador) a la vez. La solución es usar dos consultas y combinarlas mediante anidamiento.
He añadido silenciosamente un ORDER BY. Su formato es ORDER BY <column>, <column>, ... y puede modificarse con DESC para orden descendente.
Condado Harris
¿Te sorprende que Harris (Houston), Dallas, Bexar y Tarrant sumen cerca del 50% de las ejecuciones en Texas? Parte de la explicación es que la distribución de ejecuciones sigue en parte la distribución poblacional. El censo de Texas de 2010 muestra que esos cuatro condados tenían 10.0M de población, el 40.0% de Texas (25.1M), lo que atenúa la sorpresa.
Sin embargo, Harris destaca: tiene 16.4% de la población pero 23.1% de las ejecuciones, casi 50% más de lo esperado.
Estudios han sugerido varias razones: procesos de enjuiciamiento bien financiados, fiscales con fuerte interés en la pena de muerte, jueces electos y déficits en controles y balances en el sistema judicial local.
Resumen
En esta sección aprendimos a agregar por grupos y a usar anidamiento para usar la salida de una consulta interna en una externa. Estas técnicas permiten calcular porcentajes y otros indicadores.
MapReduce
Un apéndice interesante: hemos aprendido a hacer MapReduce en SQL. MapReduce es un paradigma que ve los cálculos como pasos de "map" y "reduce". El capítulo Beazley fue sobre mapping; este capítulo muestra cómo reducir grupos usando agregación.
En el siguiente capítulo aprenderemos sobre JOINs que permiten trabajar con múltiples tablas.