Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Liczenie wszystkich wierszy z określonymi kolumnami i grupowanie według tygodnia

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydajny sposób na symulację pełnego sprzężenia zewnętrznego w MySQL?

  2. Jak znaleźć odrębne kolumny w zagnieżdżonym podzapytaniu w SQL?

  3. Codeigniter Select_Sum zwraca tablicę, a nie wartość liczbową?

  4. Jak wyłączyć buforowanie SQLAlchemy?

  5. MySQL InnoDB Wyszukiwanie pełnotekstowe zawierające adres e-mail