Ihre Abfrage ist nicht deterministisch, daher überrascht es nicht, dass Sie unerwartete Ergebnisse erhalten. Damit meine ich, dass Sie diese Abfrage fünfmal mit denselben Daten ausführen und fünf verschiedene Ergebnissätze erhalten könnten. Dies liegt daran, dass Sie DATE(timestamp)
auswählen aber Gruppierung nach WEEK(DATE(startdate))
, gibt die Abfrage daher die Zeit der ersten Zeile zurück, auf die sie pro startdate week in ANY stößt bestellen.
Betrachten Sie die folgenden 2 Zeilen (mit Zeitstempel im Datumsformat zur besseren Lesbarkeit):
TimeStamp StartDate
20120601 20120601
20120701 20120601
Ihre Abfrage wird nach WEEK(StartDate)
gruppiert das ist 23, da beide Zeilen den gleichen Wert ergeben, würden Sie erwarten, dass Ihre Ergebnisse eine Zeile mit einer Anzahl von 2 haben.
JEDOCH DATE(Timestamp)
Steht auch in der Auswahlliste und da gibt es kein ORDER BY
-Anweisung hat die Abfrage keine Ahnung, welcher Zeitstempel „20120601“ oder „20120701“ zurückgegeben werden soll. Selbst bei dieser kleinen Ergebnismenge haben Sie also eine 50:50-Chance, Folgendes zu erhalten:
TimeStamp COUNT
20120601 2
und eine 50:50-Chance zu bekommen
TimeStamp COUNT
20120701 2
Wenn Sie dem Datensatz weitere Daten hinzufügen, wie folgt:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Sie könnten
bekommenTimeStamp COUNT
20120601 2
20120701 1
oder
TimeStamp COUNT
20120701 2
20120701 1
Sie können sehen, wie Sie mit 37.000.000 Zeilen bald Ergebnisse erhalten, die Sie nicht erwarten und die Sie nicht vorhersagen können!
BEARBEITEN
Da es so aussieht, als würden Sie versuchen, den Wochenstart in Ihren Ergebnissen zu erhalten, könnten Sie beim Gruppieren nach Woche Folgendes verwenden, um den Wochenstart zu erhalten (ersetzen Sie CURRENT_TIMESTAMP durch die gewünschte Spalte):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Sie können dann auch nach diesem Datum gruppieren, um wöchentliche Ergebnisse zu erhalten und den Ärger zu vermeiden, Dinge in Ihrer Auswahlliste zu haben, die nicht in Ihrer Gruppe bis sind.