Рассчитать значение месячного процентиля из значений дневного процентиля - PullRequest
0 голосов
/ 23 октября 2018

У меня есть таблица в базе данных postgres со следующим представлением:

date         name    percentile95
2018-09-01    a           0.34
2018-09-02    a           0.41
....
2018-09-29    a           0.74
2018-09-30    a           0.39
2018-10-01    a           0.31
2018-10-02    a           0.24
....
2018-10-30    a           0.64
2018-09-31    a           0.89

У меня есть значение процентиля95, соответствующее определенному имени 'а' каждый день.То, что я хочу вычислить, это значения монтильного процентиля из этих дневных значений, поэтому результат будет выглядеть следующим образом:

date         name    percentile95
2018-09-01    a    {aggreate_percentile from sept}
2018-10-01    a    {aggreate_percentile from oct}

Есть ли способ сделать это в SQL?

Редактировать:По этой ссылке невозможно рассчитать совокупные процентили.Итак, прежде всего, возможно ли даже рассчитать месячные процентили из дневных процентилей?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

demo: db <> fiddle

Использование оконных функций и date_trunc:

Запрос

SELECT
    *, 
    percentile95 / SUM(percentile95) OVER (PARTITION BY date_trunc('month', "date")) 
        * 100 as percentile_in_month
FROM
    t

Результат:

date                  name   percentile95   percentile_in_month
2018-09-01 00:00:00   a      0.34           12.2743682310469
2018-09-02 00:00:00   a      0.41           14.8014440433213
2018-09-29 00:00:00   a      0.74           26.7148014440433
2018-09-30 00:00:00   a      0.39           14.0794223826715
2018-09-30 00:00:00   a      0.89           32.129963898917
2018-10-02 00:00:00   a      0.24           20.1680672268908
2018-10-30 00:00:00   a      0.64           53.781512605042
2018-10-01 00:00:00   a      0.31           26.0504201680672
  1. date_trunc нормализует ваши даты к месяцу.
  2. Значения групп оконной функции (здесь усеченные даты)
  3. Агрегатная функция SUM суммирует все значения в группе окон
  4. Суммированные значения и исходные значения берутся для вычисления процентных значений
0 голосов
/ 23 октября 2018

Вы можете попробовать date_part функцию, чтобы получить год и месяц, затем выполнить SUM в подзапросе, затем самостоятельно присоединиться к месяцу и году и выполнить некоторые вычисления

CREATE TABLE T(
   date timestamp,
   name varchar(50),
   percentile95 float
);

insert into T values ('2018-09-01','a',0.34);
insert into T values ('2018-09-02','a',0.41);
insert into T values ('2018-09-29','a',0.74);
insert into T values ('2018-09-30','a',0.39);
insert into T values ('2018-10-01','a',0.31);
insert into T values ('2018-10-02','a',0.24);
insert into T values ('2018-10-30','a',0.64);
insert into T values ('2018-09-30','a',0.89);

Запрос 1:

select 
    date,
    t1.name, 
    concat((percentile95 * 100/total ),'%') percentile95
from T t1 JOIN (
  SELECT  
      date_part('year', date) y,
      date_part('month', date) m,
      name,
      sum(percentile95) total
  FROM T 
  group by date_part('year', date),
           date_part('month', date),
           name 
) v 
ON
  v.y = date_part('year', t1.date)
and
  v.m = date_part('month', t1.date)
and
  v.name = t1.name

Результаты :

|                 date | name |         percentile95 |
|----------------------|------|----------------------|
| 2018-09-01T00:00:00Z |    a | 12.2743682310469318% |
| 2018-09-02T00:00:00Z |    a | 14.8014440433213004% |
| 2018-09-29T00:00:00Z |    a | 26.7148014440433208% |
| 2018-09-30T00:00:00Z |    a | 14.0794223826714795% |
| 2018-09-30T00:00:00Z |    a | 32.1299638989169694% |
| 2018-10-02T00:00:00Z |    a | 20.1680672268907557% |
| 2018-10-30T00:00:00Z |    a | 53.7815126050420176% |
| 2018-10-01T00:00:00Z |    a | 26.0504201680672267% |
...