sql >> Base de Datos >  >> RDS >> PostgreSQL

Tener cláusulas de grupo por:GeneralBits de elein

Algunas personas hacen todo lo posible para evitar las cláusulas GROUP BY y HAVING en sus consultas. Los mensajes de error son quisquillosos, pero por lo general tienen razón. Las palabras clave GROUP BY y HAVING son esenciales para obtener buenos informes de SQL.

El motivo principal de GROUP BY es reducir el número de filas, generalmente por agregación. Produce solo una fila para cada agrupación coincidente de la entrada. Esto le permite realizar cálculos sofisticados a través de SQL ordinario.

Ejemplo de fruta:

Tenemos algo de fruta:

Este próximo caso nos permite mirar hacia adelante. A mediados de año, ¿qué frutas estarán disponibles? Hacemos esto con la misma consulta anterior, sin embargo, después de que se ejecuta la consulta, verificamos los valores de min (fresh_until) usando una cláusula que tiene. TENER es cómo calificas un agregado.

Todas las manzanas y uvas estarán disponibles a mediados de año.

La lista de elementos entre SELECT y FROM, la lista de objetivos. puede contener no agregados y agregados. Esas columnas no agregadas en la lista de objetivos
deben estar en la cláusula group by. El mensaje de error lo dice. El orden de las columnas en la cláusula group by es importante. Determina cómo se agrupan los agregados. El orden es a menudo jerárquico. Lo que eso significa para sus columnas es su enfoque. Podría ser fruta, o fuentes y/o fresco_hasta la fecha.

Ejemplos de naipes

Veamos otro conjunto de ejemplos que ilustran la extracción de información en naipes. Puede obtener información sobre las tarjetas en las tarjetas estándar de Wikipedia.

Suponga que reparte programáticamente seis manos de 5 cartas, como seis personas jugando al póquer. En este trato se utilizan un total de 30 cartas. Están en una mano una tabla como la siguiente, donde los nombres de las cartas y los palos se unen mediante tablas de búsqueda. Almacenamos rangos para que podamos clasificar correctamente. Usamos nombres para mostrar. Los nombres y rangos tienen una relación de uno a uno para cada una de las cartas y palos.

¿Cuál es el número de palos para cada mano? Realmente solo nos importan las manos que tienen 3 o más cartas del mismo palo. Eso nos dirá quién tiene mejores posibilidades de obtener un color de póquer. Tenga en cuenta que aunque GROUP BY parecería implicar ORDEN POR, no es así. ORDER BY debe ser explícito.

Entonces, ¿qué pasa si agrupaste mal tu consulta? Si esta mano la mesa no está agrupada por handid, obtendrá 30 registros de 6 manos de 5 cartas. Si tuviera agregados, se agruparían por fila. No muy útil.

Si agrega el nombre de la tarjeta y no incluye
el nombre de la tarjeta solo en la lista de objetivos e intenta ordenar por nombre de tarjeta,
recibirá el mensaje de error de que no debería estar en
la cláusula order by. La cláusula order by debe contener
elementos de la cláusula group by.
Sin embargo, si el nombre de la tarjeta está explícitamente en la lista de destino,

entonces el nombre de la tarjeta debe estar en la cláusula group by y
por lo tanto, debe estar permitido en la cláusula order by.

Si la consulta es por palo, habrá un mínimo de 1 o un máximo de 4 registros por palo para cada una de las seis manos. Tenga en cuenta que estamos ordenando por rango de palo que
también debe estar en la cláusula group by. su_name y su_rank tienen una relación de uno a uno.

Para ver la distribución de cartas en manos, debemos agrupar por la columna de rango de cartas. Por supuesto, hay 4 palos de cada carta, así que no verás una carta en más de cuatro manos.

Para echar un vistazo y ver quién tiene ases, podemos usar la siguiente consulta breve. Tenga en cuenta que hay una cláusula WHERE que se ejecuta mientras se recopilan las filas. HAVING se ejecuta después de recopilar las filas.

Resumen

Estos ejemplos son formas sencillas de evaluar entidades conocidas. Experimente y utilice estas sencillas reglas.

  • Si una columna está en la lista de destino y no es un agregado, debe estar en una cláusula GROUP BY.
  • Las cláusulas WHERE ocurren durante el proceso de selección.
  • Las cláusulas HAVING ocurren después de que se completan los agregados.
  • Solo los no agregados pueden estar en la cláusula ORDER BY.
  • El orden de la cláusula GROUP BY importa.