PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chọn dữ liệu cho các cửa sổ 15 phút - PostgreSQL

Cách nhanh chóng và tiện lợi: http://sqlfiddle.com/#!1/bd2f6/21 Tôi đã đặt tên cột của mình là tstamp thay vì timestamp của bạn

with t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
    (select duration from tmp group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmp on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

Giải thích ngắn gọn:

  1. Tính dấu thời gian tối thiểu và tối đa
  2. Tạo khoảng thời gian 15 phút giữa tối thiểu và tối đa
  3. Kết quả kết hợp chéo với các giá trị duy nhất về thời lượng
  4. Dữ liệu gốc kết hợp trái (kết hợp trái là quan trọng, vì điều này sẽ giữ tất cả kết hợp có thể có trong đầu ra và sẽ có null trong đó thời lượng không tồn tại trong khoảng thời gian nhất định.
  5. Tổng hợp dữ liệu. count(null)=0

Trong trường hợp bạn có nhiều bảng hơn và nên áp dụng thuật toán trên liên kết của chúng. Giả sử chúng ta có ba bảng tmp1, tmp2, tmp3 tất cả đều có cột tstampduration . Chúng tôi có thể mở rộng giải pháp trước đó:

with 

tmpout as (
  select * from tmp1 union all
  select * from tmp2 union all
  select * from tmp3
)

,t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
    (select duration from tmpout group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmpout on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

Bạn thực sự nên biết with mệnh đề trong PostgreSQL. Đây là khái niệm vô giá cho bất kỳ phân tích dữ liệu nào trong PostgreSQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Knex.js - Làm thế nào để tạo chỉ mục duy nhất với mệnh đề 'where'?

  2. Làm cách nào để thực thi SQL thô trong quá trình di chuyển django

  3. Django - Tìm kiếm toàn văn - Ký tự đại diện

  4. Django 1.8 ArrayField nối và mở rộng

  5. Cách chèn dữ liệu vào bảng bằng các thủ tục được lưu trữ trong postgresql