Czy można wykonać proste zapytanie, aby policzyć, ile rekordów mam w określonym przedziale czasowym, takim jak rok, miesiąc lub dzień, mając TIMESTAMP
pole takie jak:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Lub nawet:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Aby mieć miesięczne statystyki.
Dzięki!
GROUP BY record_date.MONTH
w twoim pierwszym fragmencie kodu?Odpowiedzi:
Sprawdź funkcje daty i godziny w MySQL.
źródło
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
uwaga: data_rejestru jest datą typu TIMESTAMPUwaga (przede wszystkim do potencjalnych downvoters). Obecnie może to nie być tak skuteczne, jak inne sugestie. Mimo to pozostawiam to jako alternatywę, która może pomóc w sprawdzeniu szybkości innych rozwiązań. (Bo tak naprawdę nie można szybko odróżnić od spowolnienia, dopóki nie zobaczysz różnicy.) Z biegiem czasu można również wprowadzić zmiany w silniku MySQL w zakresie optymalizacji, aby w pewnym stopniu wprowadzić takie rozwiązanie (być może nie tak odległe) punkt w przyszłości, aby stać się dość porównywalnym pod względem wydajności z większością innych.
źródło
EXTRACT()
mogą być bardziej wydajne niżDATE_FORMAT()
. (Nie mam jednak MySQL do prawidłowego testowania.)Spróbuj tego
Funkcja EKSTRAKT (jednostka od daty) jest lepsza, ponieważ stosuje się mniejsze grupowanie, a funkcja zwraca wartość liczbową.
Warunek porównania podczas grupowania będzie szybszy niż funkcja DATE_FORMAT (która zwraca wartość ciągu). Spróbuj użyć pola funkcji |, które zwracają wartość nieciągową dla warunku porównania SQL (GDZIE, POSIADANIE, ORDER BY, GROUP BY).
źródło
Próbowałem użyć powyższego wyrażenia „GDZIE”, myślałem, że jest poprawny, ponieważ nikt go nie poprawił, ale się myliłem; po kilku wyszukiwaniach dowiedziałem się, że jest to właściwa formuła dla instrukcji WHERE, więc kod wygląda następująco:
źródło
Jeśli Twoje wyszukiwanie trwa kilka lat i nadal chcesz grupować co miesiąc, sugeruję:
wersja 1:
wersja # 2 (bardziej wydajna) :
Porównałem te wersje na dużym stole z 1357 918 wierszami (innodb), a druga wersja wydaje się mieć lepsze wyniki.
wersja1 (średnio 10 wykonań) : 1,404 sekundy
wersja2 (średnio 10 wykonań) : 0,780 sekund
(
SQL_NO_CACHE
dodano klucz, aby zapobiec buforowaniu MySQL do zapytań).źródło
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, ale dlaczego nie przetestowaćGROUP BY YEAR(record_date), MONTH(record_date)
?*100
w wersji # 2? Z góry dziękuję.*100
doYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Jeśli chcesz pogrupować według daty w MySQL, użyj poniższego kodu:
Mam nadzieję, że zaoszczędzi to trochę czasu tym, którzy znajdą ten wątek.
źródło
MONTH(record_date)
aby rozliczać się przez wiele miesięcy.Jeśli chcesz filtrować rekordy dla określonego roku (np. 2000), zoptymalizuj następującą
WHERE
klauzulę:Zamiast:
Wyniki zostały wygenerowane na podstawie tabeli zawierającej 300 tys. Wierszy i kolumny indeksu według daty.
Jeśli chodzi o
GROUP BY
klauzulę, przetestowałem trzy warianty w stosunku do powyższej tabeli; Oto wyniki:Ostatni jest zwycięzcą.
źródło
Kompletne i proste rozwiązanie z podobnie działającą, ale krótszą i bardziej elastyczną alternatywą obecnie aktywną:
źródło
Jeśli chcesz otrzymywać miesięczne statystyki z liczbą wierszy na miesiąc każdego roku uporządkowane według ostatniego miesiąca, spróbuj tego:
źródło
Możesz to zrobić po prostu funkcję MYSql DATE_FORMAT () w GROUP BY. W niektórych przypadkach możesz chcieć dodać dodatkową kolumnę dla większej przejrzystości, na przykład gdy rekordy obejmują kilka lat, a następnie ten sam miesiąc w różnych latach. Tutaj jest tyle opcji, które możesz dostosować. Przeczytaj to przed rozpoczęciem. Mam nadzieję, że powinno to być dla ciebie bardzo pomocne. Oto przykładowe zapytanie do zrozumienia
źródło
Następujące zapytanie działało dla mnie w Oracle Database 12c Release 12.1.0.1.0
źródło
Wolę zoptymalizować wybór grupy na jeden rok tak:
W ten sposób możesz po prostu powiązać rok za jednym razem, np.
'2009'
Z nazwanym parametrem i nie musisz martwić się o dodanie'-01-01'
lub przekazanie'2010'
osobno.Ponadto, jak przypuszczalnie jesteśmy tylko liczenie wierszy i
id
nigdy nie jestNULL
, wolęCOUNT(*)
sięCOUNT(id)
.źródło
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> MAJ.... group by to_char(date,'YY')
---> 89źródło