Agregasi data per jam SQL di postgresql

9

Saya seorang pemula dengan database jadi saya mencari bantuan Anda dengan yang ini.

Saya memiliki tabel yang berisi data deret waktu.

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20

Tabel menyimpan data berbasis interval dengan hanya menjaga batas atas interval. Misalnya baris pertama mewakili interval dari [00:00 - 00:10] dengan nilai 10, baris kedua mewakili interval dari (00:10 - 00:30] dengan nilai 5 dan yang ketiga mewakili Interval mulai (00:30 - 01:00) dengan nilai 10.

Saya memerlukan kueri yang efisien dalam Postgres untuk mengumpulkan data per jam untuk struktur seperti yang dijelaskan di atas. Jadi hasilnya akan seperti ini:

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30

Perhatikan bahwa data deret waktu sangat besar sehingga bantuan pengindeksan ini akan sangat dihargai.

Terima kasih, dan

dan
sumber
1
Dalam data sampel Anda, misalnya 2012/01/01 00:10, 10, apakah semua nilai itu dalam satu kolom, atau apakah koma pembatas kolom? Juga, apakah jam pastinya (1:00, 2:00, 3:00, dll.) Dijamin untuk disimpan dalam tabel deret waktu, atau mungkinkah melewati: 00 dan memiliki entri seperti 2012/01/01 03:50diikuti oleh 2012/01/01 04:10?
dartonw
Bagaimana jika Anda punya waktu satu jam tanpa data sumber? Apakah Anda masih menginginkan output seperti 2012/01/01 04:00, 2012/01/01 05:00, 0? atau haruskah jam itu dihilangkan dari ringkasan?
Joshua Huber
@dartonw - koma adalah pembatas kolom. Jadi waktu tanggal dan nilainya adalah kolom yang berbeda dalam sebuah tabel. Jam yang pasti dijamin akan selalu disimpan.
dan

Jawaban:

8
select
  date_trunc('hour', t - interval '1 minute') as interv_start,
  date_trunc('hour', t - interval '1 minute')  + interval '1 hours' as interv_end,
 sum(v)
  from myt 
    group by date_trunc('hour', t - interval '1 minute')
order by interv_start

lihat sqlfiddle

Sedangkan untuk indeks: Anda bisa mencoba fungsi indeks date_trunc('hour', t - interval '1 minute')tetapi saya tidak yakin postgresql dapat menggunakannya.

Leo
sumber
Terima kasih, bos saya senang. Tetapi jika Anda membutuhkan pendekatan tepat berbasis sains yang nyata , silakan belajar untuk bekerja dengan fungsi jendela. PostgreSQL mendukung mereka secara native: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak
terbalik! bagaimana Anda melakukan ini jika ini adalah 30 menit, bukannya 1 jam
PirateApp