PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wiele średnich w równomiernie rozmieszczonych odstępach

Proponuję przydatną funkcję width_bucket() :

Aby uzyskać średnią dla każdego segmentu czasu ("bin"):

SELECT width_bucket(extract(epoch FROM t.the_date)
                  , x.min_epoch, x.max_epoch, x.bins) AS bin
     , avg(value) AS bin_avg
FROM   tbl t
    , (SELECT extract(epoch FROM min(the_date)) AS min_epoch
            , extract(epoch FROM max(the_date)) AS max_epoch
            , 10 AS bins
       FROM   tbl t
      ) x
GROUP  BY 1;

Aby uzyskać „średnią bieżącą” w rosnącym (krok po kroku) przedziale czasu:

SELECT bin, round(sum(bin_sum) OVER w /sum(bin_ct) OVER w, 2) AS running_avg
FROM  (
   SELECT width_bucket(extract(epoch FROM t.the_date)
                     , x.min_epoch, x.max_epoch, x.bins) AS bin
        , sum(value) AS bin_sum
        , count(*)   AS bin_ct
   FROM   tbl t
       , (SELECT extract(epoch FROM min(the_date)) AS min_epoch
               , extract(epoch FROM max(the_date)) AS max_epoch
               , 10 AS bins
          FROM   tbl t
         ) x
   GROUP  BY 1
   ) sub
WINDOW w AS (ORDER BY bin)
ORDER  BY 1;

Korzystanie z the_date zamiast data jako nazwę kolumny, unikając słów zarezerwowanych jako identyfikatory.
Od width_bucket() jest obecnie zaimplementowany tylko dla podwójnej precyzji i numeryczne , wyodrębniam wartości epoki z the_date . Szczegóły tutaj:
Agregacja chmur punktów współrzędnych (x,y) w 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. pgbouncer - zamykanie, ponieważ:nieczysty serwer przy każdym połączeniu

  2. PostgreSQL wyłącza więcej danych wyjściowych

  3. instrukcja dla npgsql przy użyciu parametru

  4. Gorutyny zablokowały pulę połączeń

  5. Usuwanie przy użyciu CTE wolniej niż przy użyciu tabeli tymczasowej w Postgresie