Tập hợp dữ liệu hàng giờ của SQL trong postgresql


9

Tôi là người mới sử dụng cơ sở dữ liệu nên tôi đang tìm kiếm sự giúp đỡ của bạn với cơ sở dữ liệu này.

Tôi có một bảng chứa dữ liệu chuỗi thời gian.

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

Bảng đang lưu trữ dữ liệu dựa trên khoảng thời gian bằng cách chỉ giữ giới hạn trên của khoảng. Ví dụ: hàng đầu tiên biểu thị một khoảng từ [00:00 - 00:10] với giá trị là 10, hàng thứ hai biểu thị một khoảng từ (00:10 - 00:30] với giá trị là 5 và hàng thứ ba đại diện cho một khoảng thời gian từ (00:30 - 01:00) với giá trị là 10.

Tôi cần một truy vấn hiệu quả trong Postgres để tổng hợp dữ liệu hàng giờ cho một cấu trúc giống như cấu trúc được mô tả ở trên. Vì vậy, kết quả sẽ là một cái gì đó như thế này:

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

Lưu ý rằng dữ liệu chuỗi thời gian là lớn vì vậy bất kỳ trợ giúp nào về lập chỉ mục này sẽ được đánh giá cao.

Cảm ơn


1
Trong dữ liệu mẫu của bạn, ví dụ 2012/01/01 00:10, 10, tất cả các giá trị đó trong một cột hay dấu phẩy là dấu phân cách cột? Ngoài ra, các giờ chính xác (1:00, 2:00, 3:00, v.v.) có được đảm bảo được lưu trữ trong bảng chuỗi thời gian không, hoặc có thể bỏ qua: 00 và có các mục như 2012/01/01 03:50sau 2012/01/01 04:10không?
dartonw

Điều gì nếu bạn có một giờ không có dữ liệu nguồn? Bạn vẫn muốn một đầu ra như thế 2012/01/01 04:00, 2012/01/01 05:00, 0nào? hoặc giờ đó chỉ nên được bỏ qua khỏi bản tóm tắt?
Joshua Huber

@dartonw - dấu phẩy là một dấu phân cách cột. Vì vậy, thời gian ngày và giá trị là các cột khác nhau trong một bảng. Giờ chính xác được đảm bảo luôn được lưu trữ.
dan

Câu trả lời:


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

xem sqlfiddle

Đối với chỉ mục: bạn có thể thử một chỉ mục chức năng trên date_trunc('hour', t - interval '1 minute')nhưng tôi không chắc postgresql có thể sử dụng nó.


Cảm ơn bạn, ông chủ của tôi rất vui. Nhưng nếu bạn cần cách tiếp cận chính xác dựa trên khoa học , xin vui lòng, nghiên cứu để làm việc với các chức năng của cửa sổ. PostgreSQL hỗ trợ chúng một cách tự nhiên: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak

nâng cao tinh thần! bạn sẽ làm điều này như thế nào nếu đây là 30 phút thay vì 1 giờ
PirateApp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.