La tua query non è deterministica, quindi non sorprende che tu stia ottenendo risultati inaspettati. Con questo intendo dire che potresti eseguire questa query sugli stessi dati 5 volte e ottenere 5 diversi set di risultati. Ciò è dovuto al fatto che stai selezionando DATE(timestamp)
ma raggruppando per WEEK(DATE(startdate))
, la query restituisce quindi l'ora della prima riga che incontra per settimana di data di inizio in ANY ordine.
Considera le 2 righe seguenti (con timestamp in formato data per facilitarne la lettura):
TimeStamp StartDate
20120601 20120601
20120701 20120601
La tua query è raggruppata per WEEK(StartDate)
che è 23, poiché entrambe le righe restituiscono lo stesso valore, ti aspetteresti che i tuoi risultati abbiano 1 riga con un conteggio di 2.
COMUNQUE DATE(Timestamp)
È anche nell'elenco selezionato e poiché non esiste ORDER BY
istruzione la query non ha idea di quale timestamp restituire '20120601' o '20120701'. Quindi, anche su questo piccolo set di risultati hai una possibilità del 50:50 di ottenere:
TimeStamp COUNT
20120601 2
e una possibilità di 50:50 di ottenere
TimeStamp COUNT
20120701 2
Se aggiungi più dati al set di dati in questo modo:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Potresti ottenere
TimeStamp COUNT
20120601 2
20120701 1
o
TimeStamp COUNT
20120701 2
20120701 1
Puoi vedere come con 37.000.000 di righe otterrai presto risultati che non ti aspetti e non puoi prevedere!
MODIFICA
Poiché sembra che tu stia cercando di ottenere l'inizio della settimana nei risultati, mentre raggruppa per settimana potresti utilizzare quanto segue per ottenere l'inizio della settimana (sostituendo CURRENT_TIMESTAMP con la colonna che desideri):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Puoi quindi raggruppare anche per questa data per ottenere risultati settimanali ed evitare il problema di avere cose nell'elenco selezionato che non sono nel tuo gruppo per.