¿Es posible hacer una consulta simple para contar cuántos registros tengo en un período de tiempo determinado, como un año, mes o día, teniendo un TIMESTAMP
campo, como:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
O incluso:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Tener una estadística mensual.
¡Gracias!
GROUP BY record_date.MONTH
en tu primer fragmento de código?Respuestas:
Consulte las funciones de fecha y hora en MySQL.
fuente
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
nota: record_date es un tipo de fecha TIMESTAMPNota (principalmente, para potenciales downvoters). Actualmente, esto puede no ser tan eficiente como otras sugerencias. Aún así, lo dejo como una alternativa, y también una, que puede servir para ver qué tan rápidas son otras soluciones. (Porque realmente no se puede distinguir rápido de lento hasta que ve la diferencia). Además, a medida que pasa el tiempo, se podrían hacer cambios en el motor de MySQL con respecto a la optimización para hacer esta solución, en algunos casos (tal vez, no tan distante) en el futuro, para llegar a ser bastante comparable en eficiencia con la mayoría de los demás.
fuente
EXTRACT()
pueden ser más eficientes queDATE_FORMAT()
. (Sin embargo, no tengo un MySQL para realizar las pruebas adecuadas).prueba este
La función EXTRACT (unit FROM date) es mejor ya que se utiliza menos agrupación y la función devuelve un valor numérico.
La condición de comparación al agrupar será más rápida que la función DATE_FORMAT (que devuelve un valor de cadena). Intente utilizar un campo de función que devuelva un valor que no sea de cadena para la condición de comparación de SQL (WHERE, HAVING, ORDER BY, GROUP BY).
fuente
Intenté usar la declaración 'WHERE' anterior, pensé que era correcta ya que nadie la corrigió pero me equivoqué; Después de algunas búsquedas descubrí que esta es la fórmula correcta para la instrucción WHERE, por lo que el código se convierte así:
fuente
Si su búsqueda ha durado varios años y aún desea agruparse mensualmente, le sugiero:
versión 1:
versión # 2 (más eficiente) :
Comparé estas versiones en una mesa grande con 1,357,918 filas (innodb), y la segunda versión parece tener mejores resultados.
version1 (promedio de 10 ejecuta) : 1.404 segundos
version2 (promedio de 10 ejecuta) : 0.780 segundos
(
SQL_NO_CACHE
clave agregada para evitar que MySQL CACHE a consultas).fuente
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, pero ¿por qué no probarGROUP BY YEAR(record_date), MONTH(record_date)
también?*100
en la versión # 2? Gracias por adelantado.*100
aYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Si desea agrupar por fecha en MySQL, utilice el siguiente código:
Espero que esto ahorre algo de tiempo para los que van a encontrar este hilo.
fuente
MONTH(record_date)
para tener en cuenta varios meses.Si desea filtrar registros para un año en particular (por ejemplo, 2000), optimice la
WHERE
cláusula de esta manera:En vez de:
Los resultados se generaron en una tabla que contiene 300k filas e índice en la columna de fecha.
En cuanto a la
GROUP BY
cláusula, probé las tres variantes contra la tabla mencionada anteriormente; aquí están los resultados:El último es el ganador.
fuente
Solución completa y simple con un rendimiento similar pero más corto y una alternativa más flexible actualmente activa:
fuente
Si desea obtener estadísticas mensuales con recuentos de filas por mes de cada año ordenado por el último mes, intente esto:
fuente
Puede hacer esto simplemente con la función Mysql DATE_FORMAT () en GROUP BY. Es posible que desee agregar una columna adicional para mayor claridad en algunos casos, como cuando los registros abarcan varios años y luego se produce el mismo mes en diferentes años. Aquí hay tantas opciones que puede personalizar. Lea esto antes de comenzar. Espero que sea de mucha ayuda para ti. Aquí hay una muestra de consulta para su comprensión
fuente
La siguiente consulta funcionó para mí en Oracle Database 12c Release 12.1.0.1.0
fuente
Prefiero optimizar la selección de grupo de un año así:
De esta manera, puede vincular el año de una vez, por ejemplo
'2009'
, con un parámetro con nombre y no tiene que preocuparse por agregar'-01-01'
o pasar por'2010'
separado.Además, como presumiblemente solo estamos contando filas y
id
nuncaNULL
, prefieroCOUNT(*)
hacerloCOUNT(id)
.fuente
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> MAYO.... group by to_char(date,'YY')
---> 89fuente