Twoje zapytanie nie jest deterministyczne, więc nie jest zaskoczeniem, że otrzymujesz nieoczekiwane wyniki. Mam na myśli to, że możesz uruchomić to zapytanie na tych samych danych 5 razy i uzyskać 5 różnych zestawów wyników. Wynika to z faktu, że wybierasz DATE(timestamp)
ale grupowanie według WEEK(DATE(startdate))
, zapytanie zwraca zatem czas pierwszego napotkanego wiersza w każdym tygodniu daty rozpoczęcia w DOWOLNYM zamówienie.
Rozważ następujące 2 wiersze (ze znacznikiem czasu w formacie daty dla ułatwienia czytania):
TimeStamp StartDate
20120601 20120601
20120701 20120601
Twoje zapytanie jest grupowane według WEEK(StartDate)
czyli 23, ponieważ oba wiersze mają tę samą wartość, można oczekiwać, że wyniki będą miały 1 wiersz z liczbą 2.
JEDNAK DATE(timestamp)
Znajduje się również na liście wyboru, a ponieważ nie ma ORDER BY
instrukcja zapytanie nie ma pojęcia, który znacznik czasu zwrócić „20120601” lub „20120701”. Więc nawet przy tym małym zestawie wyników masz szansę 50:50 na uzyskanie:
TimeStamp COUNT
20120601 2
i 50:50 szansa na zdobycie
TimeStamp COUNT
20120701 2
Jeśli w ten sposób dodasz więcej danych do zbioru danych:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Możesz dostać
TimeStamp COUNT
20120601 2
20120701 1
lub
TimeStamp COUNT
20120701 2
20120701 1
Możesz zobaczyć, jak z 37 000 000 wierszy wkrótce uzyskasz wyniki, których się nie spodziewasz i których nie możesz przewidzieć!
EDYTUJ
Ponieważ wygląda na to, że próbujesz uzyskać początek tygodnia w swoich wynikach, podczas grupowania po tygodniu możesz użyć następujących elementów, aby uzyskać początek tygodnia (zastępując CURRENT_TIMESTAMP dowolną kolumną):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Następnie możesz pogrupować według tej daty, aby uzyskać cotygodniowe wyniki i uniknąć kłopotów z posiadaniem na liście wybranych elementów, których nie ma w Twojej grupie według.