Uw zoekopdracht is niet deterministisch, dus het is niet verwonderlijk dat u onverwachte resultaten krijgt. Hiermee bedoel ik dat je deze query 5 keer op dezelfde gegevens kunt uitvoeren en 5 verschillende resultatensets kunt krijgen. Dit komt doordat u DATE(timestamp)
. selecteert maar groeperen op WEEK(DATE(startdate))
, de zoekopdracht retourneert daarom de tijd van de eerste rij die hij tegenkomt per startdatumweek in ANY bestellen.
Houd rekening met de volgende 2 rijen (met tijdstempel in datumnotatie voor leesgemak):
TimeStamp StartDate
20120601 20120601
20120701 20120601
Uw zoekopdracht is gegroepeerd op WEEK(StartDate)
dat is 23, aangezien beide rijen dezelfde waarde opleveren, zou je verwachten dat je resultaten 1 rij hebben met een telling van 2.
Echter DATE(Timestamp)
Staat ook in de select lijst en aangezien er geen ORDER BY
. is statement de query heeft geen idee welk tijdstempel '20120601' of '20120701' moet retourneren. Dus zelfs met deze kleine resultatenset heb je een kans van 50:50 om:
TimeStamp COUNT
20120601 2
en een kans van 50:50 om
TimeStamp COUNT
20120701 2
Als u als volgt meer gegevens aan de gegevensset toevoegt:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Je zou kunnen krijgen
TimeStamp COUNT
20120601 2
20120701 1
of
TimeStamp COUNT
20120701 2
20120701 1
U kunt zien hoe u met 37.000.000 rijen snel resultaten krijgt die u niet verwacht en niet kunt voorspellen!
BEWERKEN
Aangezien het lijkt alsof u de weekstart in uw resultaten probeert te krijgen, kunt u groepsgewijs de volgende gebruiken om de weekstart te krijgen (vervang CURRENT_TIMESTAMP door de gewenste kolom):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Je kunt dan ook op deze datum groeperen om wekelijkse resultaten te krijgen en te voorkomen dat je dingen in je selectielijst hebt staan die niet in je groep staan op.