sql >> Databáze >  >> RDS >> Mysql

Počítání všech řádků s konkrétními sloupci a seskupení podle týdnů

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.



  1. Rozdíly mezi MySQL a SQL Serverem

  2. Jsou dynamické dotazy mysql s escapováním sql stejně bezpečné jako připravené příkazy?

  3. date_trunc 5minutový interval v PostgreSQL

  4. mysqltuner.pl na serveru Windows 2008 r2