sql >> Base de Datos >  >> RDS >> Mysql

Contando todas las filas con columnas específicas y agrupando por semana

Su consulta no es determinista, por lo que no sorprende que obtenga resultados inesperados. Con esto quiero decir que podría ejecutar esta consulta en los mismos datos 5 veces y obtener 5 conjuntos de resultados diferentes. Esto se debe al hecho de que está seleccionando DATE(timestamp) pero agrupando por WEEK(DATE(startdate)) , por lo tanto, la consulta devuelve la hora de la primera fila que encuentra por semana de fecha de inicio en ANY orden.

Considere las siguientes 2 filas (con marca de tiempo en formato de fecha para facilitar la lectura):

TimeStamp       StartDate
20120601        20120601
20120701        20120601

Su consulta se está agrupando por WEEK(StartDate) que es 23, dado que ambas filas se evalúan con el mismo valor, esperaría que sus resultados tuvieran 1 fila con un recuento de 2.

SIN EMBARGO DATE(Timestamp) También está en la lista de selección y como no hay ORDER BY declaración la consulta no tiene idea de qué marca de tiempo devolver '20120601' o '20120701'. Entonces, incluso en este pequeño conjunto de resultados, tiene una probabilidad de 50:50 de obtener:

TimeStamp       COUNT
20120601        2

y una probabilidad de 50:50 de obtener

TimeStamp       COUNT
20120701        2

Si agrega más datos al conjunto de datos así:

TimeStamp       StartDate
20120601        20120601
20120701        20120601
20120701        20120701

Podrías obtener

TimeStamp       COUNT
20120601        2
20120701        1

o

TimeStamp       COUNT
20120701        2
20120701        1

¡Puedes ver cómo con 37 000 000 de filas pronto obtendrás resultados que no esperas ni puedes predecir!

EDITAR

Dado que parece que está tratando de obtener el inicio de la semana en sus resultados, mientras que, grupo por semana, podría usar lo siguiente para obtener el inicio de la semana (reemplazando CURRENT_TIMESTAMP con la columna que desee):

SELECT  DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart

Luego, también puede agrupar por esta fecha para obtener resultados semanales y evitar la molestia de tener cosas en su lista de selección que no están en su grupo por.