Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comptage de toutes les lignes avec des colonnes spécifiques et regroupement par semaine

Votre requête n'est pas déterministe, il n'est donc pas surprenant que vous obteniez des résultats inattendus. J'entends par là que vous pouvez exécuter cette requête sur les mêmes données 5 fois et obtenir 5 ensembles de résultats différents. Cela est dû au fait que vous sélectionnez DATE(timestamp) mais regroupement par WEEK(DATE(startdate)) , la requête renvoie donc l'heure de la première ligne rencontrée par semaine de date de début dans TOUT commande.

Considérez les 2 lignes suivantes (avec l'horodatage au format date pour faciliter la lecture) :

TimeStamp       StartDate
20120601        20120601
20120701        20120601

Votre requête est regroupée par WEEK(StartDate) qui est 23, puisque les deux lignes ont la même valeur, vous vous attendez à ce que vos résultats aient 1 ligne avec un nombre de 2.

CEPENDANT DATE(Timestamp) Est également dans la liste de sélection et puisqu'il n'y a pas de ORDER BY la requête n'a aucune idée de l'horodatage à renvoyer '20120601' ou '20120701'. Ainsi, même sur ce petit ensemble de résultats, vous avez 50 h 50 de chances d'obtenir :

TimeStamp       COUNT
20120601        2

et 50 h 50 de chance d'obtenir

TimeStamp       COUNT
20120701        2

Si vous ajoutez plus de données à l'ensemble de données :

TimeStamp       StartDate
20120601        20120601
20120701        20120601
20120701        20120701

Vous pourriez obtenir

TimeStamp       COUNT
20120601        2
20120701        1

ou

TimeStamp       COUNT
20120701        2
20120701        1

Vous pouvez voir comment avec 37 000 000 de lignes, vous obtiendrez bientôt des résultats auxquels vous ne vous attendiez pas et que vous ne pouvez pas prédire !

MODIFIER

Puisqu'il semble que vous essayez d'obtenir le début de la semaine dans vos résultats, alors que vous groupez par semaine, vous pouvez utiliser ce qui suit pour obtenir le début de la semaine (en remplaçant CURRENT_TIMESTAMP par la colonne de votre choix) :

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

Vous pouvez également regrouper par cette date pour obtenir des résultats hebdomadaires et éviter le problème d'avoir des éléments dans votre liste de sélection qui ne sont pas dans votre groupe par.