select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
Atas permintaan Radu, saya akan menjelaskan pertanyaan itu:
to_char(date,'Mon') as mon,
: mengonversi atribut "date" ke dalam format yang ditentukan dari bentuk pendek bulan.
extract(year from date) as yyyy
: Fungsi "ekstrak" Postgresql digunakan untuk mengekstrak tahun YYYY dari atribut "date".
sum("Sales") as "Sales"
: Fungsi SUM () menambahkan semua nilai "Penjualan", dan memasok alias case-sensitive, dengan sensitivitas case dipertahankan dengan menggunakan tanda kutip ganda.
group by 1,2
: Fungsi GROUP BY harus berisi semua kolom dari daftar SELECT yang bukan bagian dari agregat (alias, semua kolom tidak di dalam fungsi SUM / AVG / MIN / MAX dll). Ini memberi tahu kueri bahwa SUM () harus diterapkan untuk setiap kombinasi kolom yang unik, yang dalam hal ini adalah kolom bulan dan tahun. Bagian "1,2" adalah singkatan daripada menggunakan alias kolom, meskipun mungkin lebih baik menggunakan ekspresi "to_char (...)" dan "ekstrak (...)" yang lengkap untuk keterbacaan.
date_trunc
tidak persis apa yang diinginkan penanya:select date_trunc('month', timestamp '2001-02-16 20:38:40')::date
=>2001-02-01
date_trunc
dalamgroup by
klausa.Saya tidak percaya jawaban yang diterima memiliki begitu banyak upvotes - ini adalah metode yang mengerikan.
Inilah cara yang benar untuk melakukannya, dengan date_trunc :
Ini praktik yang buruk tetapi Anda mungkin dimaafkan jika Anda menggunakannya
dalam permintaan yang sangat sederhana.
Anda juga bisa menggunakan
jika Anda tidak ingin memilih tanggal.
sumber
date_trunc
apa yang diharapkan penanya: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
telah dibuat untuk tujuan yang tepat ini. tidak ada alasan untuk membuat dua kolomto_char
sebenarnya memungkinkan Anda menarik Tahun dan bulan dalam satu gerakan!atau dalam kasus contoh pengguna di atas:
sumber
date_trunc
metode ketika melakukan grup oleh. Bereksperimen dengan DB yang saya miliki, di atas meja dengan baris 270k, metode date_trunc lebih dari dua kali kecepatan TO_CHARAda cara lain untuk mencapai hasil menggunakan fungsi date_part () di postgres.
Terima kasih
sumber
jawaban bma luar biasa! Saya telah menggunakannya dengan ActiveRecords, ini dia kalau ada yang membutuhkannya di Rails:
sumber
yourscopeorclass.group("extract(year from tablename.colname)")
dan Anda dapatLihatlah contoh E tutorial ini -> https://www.postgresqltutorial.com/postgresql-group-by/
Anda perlu memanggil fungsi pada GROUP BY Anda alih-alih memanggil nama atribut virtual yang Anda buat pada pilih. Saya melakukan apa yang direkomendasikan semua jawaban di atas dan saya mendapatkan
column 'year_month' does not exist
kesalahan.Apa yang berhasil untuk saya adalah:
sumber
Postgres memiliki beberapa jenis cap waktu:
timestamp tanpa zona waktu - (Lebih disukai menyimpan cap waktu UTC) Anda menemukannya di penyimpanan basis data multinasional. Klien dalam hal ini akan menangani penggantian zona waktu untuk masing-masing negara.
timestamp dengan zona waktu - Offset zona waktu sudah termasuk dalam timestamp.
Dalam beberapa kasus, basis data Anda tidak menggunakan zona waktu tetapi Anda masih perlu mengelompokkan catatan sehubungan dengan zona waktu lokal dan Waktu Musim Panas (mis. Https://www.timeanddate.com/time/zone/romania/bucharest )
Untuk menambahkan zona waktu, Anda dapat menggunakan contoh ini dan mengganti zona waktu dengan milik Anda.
Untuk menambahkan +1 Waktu Musim Panas khusus untuk DST Anda perlu memeriksa apakah cap waktu Anda jatuh ke dalam Summer DST. Karena interval tersebut bervariasi dengan 1 atau 2 hari, saya akan menggunakan aproximation yang tidak mempengaruhi catatan akhir bulan, jadi dalam hal ini saya dapat mengabaikan interval tepat setiap tahun.
Jika kueri yang lebih tepat harus dibuat, maka Anda harus menambahkan kondisi untuk membuat lebih banyak kasus. Namun secara kasar, ini akan berfungsi dengan baik dalam membagi data per bulan sehubungan dengan zona waktu dan SummerTime ketika Anda menemukan cap waktu tanpa zona waktu di basis data Anda:
sumber