select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
Na prośbę Radu wyjaśnię to pytanie:
to_char(date,'Mon') as mon,
: konwertuje atrybut "date" na zdefiniowany format krótkiej formy miesiąca.
extract(year from date) as yyyy
: Funkcja "extract" Postgresql służy do wyodrębnienia roku RRRR z atrybutu "date".
sum("Sales") as "Sales"
: Funkcja SUMA () sumuje wszystkie wartości „Sprzedaż” i podaje alias z rozróżnianiem wielkości liter, z rozróżnianiem wielkości liter dzięki zastosowaniu podwójnych cudzysłowów.
group by 1,2
: Funkcja GROUP BY musi zawierać wszystkie kolumny z listy SELECT, które nie są częścią agregacji (czyli wszystkie kolumny spoza funkcji SUMA / AVG / MIN / MAX itd.). Informuje to zapytanie, że funkcja SUMA () powinna zostać zastosowana dla każdej unikalnej kombinacji kolumn, którymi w tym przypadku są kolumny miesiąca i roku. Część „1,2” jest skrótem zamiast używać aliasów kolumn, chociaż prawdopodobnie najlepiej jest użyć pełnych wyrażeń „to_char (...)” i „wyodrębnij (...)” w celu zwiększenia czytelności.
date_trunc
nie jest dokładnie tym, czego chciałselect date_trunc('month', timestamp '2001-02-16 20:38:40')::date
2001-02-01
date_trunc
wgroup by
klauzuli.Nie mogę uwierzyć, że zaakceptowana odpowiedź ma tyle pozytywnych opinii - to okropna metoda.
Oto poprawny sposób na zrobienie tego z date_trunc :
To zła praktyka, ale możesz otrzymać wybaczenie, jeśli używasz
w bardzo prostym zapytaniu.
Możesz także użyć
jeśli nie chcesz wybierać daty.
źródło
date_trunc
nie jest tym, czego oczekiwał pytający:select date_trunc('month', timestamp '2001-02-16 20:38:40')
=>2001-02-01 00:00:00
.to_char(date_trunc('month', txn_date), 'YY-Mon')
date_trunc
został stworzony właśnie w tym celu. nie ma powodu, aby tworzyć dwie kolumnyto_char
faktycznie pozwala wyciągnąć rok i miesiąc za jednym zamachem!lub w przypadku powyższego przykładu użytkownika:
źródło
date_trunc
metoda wykonywania grupy wg. Eksperymentując z bazą danych, którą mam pod ręką, na tabeli z 270 tysiącami wierszy metoda date_trunc jest ponad dwukrotnie większa niż TO_CHARIstnieje inny sposób osiągnięcia wyniku za pomocą funkcji date_part () w postgres.
Dzięki
źródło
Odpowiedź bma jest świetna! Użyłem go z ActiveRecords, tutaj jest, jeśli ktoś potrzebuje tego w Railsach:
źródło
yourscopeorclass.group("extract(year from tablename.colname)")
i możesz połączyć to razem 3 razy, aby uzyskać rok, miesiąc, dzieńSpójrz na przykład E tego samouczka -> https://www.postgresqltutorial.com/postgresql-group-by/
Musisz wywołać funkcję w swoim GROUP BY zamiast wywoływać nazwę atrybutu wirtualnego, który utworzyłeś w select. Robiłem to, co zalecały wszystkie powyższe odpowiedzi i otrzymywałem
column 'year_month' does not exist
błąd.U mnie zadziałało:
źródło
Postgres ma kilka typów znaczników czasu:
sygnatura czasowa bez strefy czasowej - (najlepiej przechowywać znaczniki czasu UTC) Można ją znaleźć w pamięci masowej wielonarodowej bazy danych. Klient w tym przypadku zajmie się przesunięciem strefy czasowej dla każdego kraju.
timestamp with timezone - Przesunięcie strefy czasowej jest już uwzględnione w sygnaturze czasowej.
W niektórych przypadkach Twoja baza danych nie korzysta ze strefy czasowej, ale nadal musisz grupować rekordy pod kątem lokalnej strefy czasowej i czasu letniego (np. Https://www.timeanddate.com/time/zone/romania/bucharest )
Aby dodać strefę czasową, możesz skorzystać z tego przykładu i zastąpić przesunięcie strefy czasowej swoim.
Aby dodać przesunięcie czasu letniego +1 specyficzne dla czasu letniego, musisz sprawdzić, czy twój znacznik czasu przypada na letni czas letni. Ponieważ te przedziały zmieniają się co 1 lub 2 dni, użyję przybliżenia, które nie wpływa na zapisy na koniec miesiąca, więc w tym przypadku mogę zignorować dokładny interwał każdego roku.
Jeśli trzeba zbudować bardziej precyzyjne zapytanie, musisz dodać warunki, aby utworzyć więcej przypadków. Ale z grubsza będzie to działać dobrze przy dzieleniu danych na miesiąc według strefy czasowej i czasu letniego, gdy znajdziesz w swojej bazie danych znacznik czasu bez strefy czasowej:
źródło