Váš dotaz není deterministický, takže není překvapivé, že dostáváte neočekávané výsledky. Tím myslím, že byste mohli spustit tento dotaz na stejných datech 5krát a získat 5 různých sad výsledků. To je způsobeno tím, že jste vybrali DATE(timestamp)
ale seskupení podle WEEK(DATE(startdate))
, dotaz proto vrací čas prvního řádku, na který narazí, za týden s počátečním datem v JAKÝKOLI objednávka.
Zvažte následující 2 řádky (s časovým razítkem ve formátu data pro snadnější čtení):
TimeStamp StartDate
20120601 20120601
20120701 20120601
Váš dotaz je seskupený podle WEEK(StartDate)
což je 23, protože oba řádky se vyhodnotí na stejnou hodnotu, očekávali byste, že vaše výsledky budou mít 1 řádek s počtem 2.
VŠAK DATE(Timestamp)
Je také ve výběrovém seznamu a protože zde není ORDER BY
dotaz nemá ponětí, které časové razítko má vrátit „20120601“ nebo „20120701“. Takže i na této malé sadě výsledků máte šanci 50:50 získat:
TimeStamp COUNT
20120601 2
a šance 50:50 získat
TimeStamp COUNT
20120701 2
Pokud do datové sady přidáte další data takto:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
Můžete získat
TimeStamp COUNT
20120601 2
20120701 1
nebo
TimeStamp COUNT
20120701 2
20120701 1
Můžete vidět, jak s 37 000 000 řádky brzy dosáhnete výsledků, které neočekáváte a nemůžete předvídat!
UPRAVIT
Vzhledem k tomu, že se zdá, že se ve svých výsledcích snažíte získat začátek týdne, můžete při skupině po týdnu použít k získání začátku týdne následující (nahraďte CURRENT_TIMESTAMP libovolným sloupcem):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
Poté se můžete seskupit také podle tohoto data, abyste získali týdenní výsledky a vyhli se problémům s věcmi, které ve vybraném seznamu nejsou.