Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zählen aller Zeilen mit bestimmten Spalten und Gruppieren nach Woche

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

bekommen
TimeStamp       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.