PostgreSQL подзапрос - вычисление среднего значения отстающих значений - PullRequest
0 голосов
/ 25 марта 2020

Я просматриваю Тарифы продаж по месяцам и смог запросить первую таблицу. Я совершенно новичок в PostgreSQL и пытаюсь выяснить, как я могу запросить второй (сейчас я должен был сделать 2-й в Excel). У меня есть текущий уровень продаж, и я хотел бы сравнить его с уровнем продаж 1 и 2 месяца a go, как усредненный показатель.

enter image description here

Я не спрашиваю ответа, как именно решить, потому что это не в том, чтобы стать лучше, а просто для подсказок для использования функций, которые указаны c до PostgreSQL. То, что я пытаюсь вычислить, - это среднее значение за 2 месяца во 2-й таблице, основанное на запаздывающих значениях 2-й таблицы. Спасибо!

Вот запрос для 1-й таблицы:

with t1 as
    (select date,
            count(sales)::numeric/count(poss_sales) as SR_1M_before 
            from data
    where date between '2019-07-01' and '2019-11-30'
            group by 1),
     t2 as
    (select date,
            count(sales)::numeric/count(poss_sales) as SR_2M_before 
            from data
    where date between '2019-07-01' and '2019-10-31'
            group by 1)
select t0.date,
       count(t0.sales)::numeric/count(t0.poss_sales) as Sales_Rate 
       t1.SR_1M_before,
       t2.SR_2M_before
        from data as t0
        left join t1 on t0.date=t1.date
        left join t2 on t0.date=t1.date
        where date between '2019-07-01' and '2019-12-31'
group by 1,3,4
order by 1;

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Ваши данные немного сбивают с толку - было бы меньше путаницы, если бы у вас были десятичные разряды (то есть 58% - это среднее значение 57%, а 58% - неочевидно).

Потому что вы хотите чтобы иметь значения NULL в первых двух строках, я собираюсь вычислить значения, используя sum() и count():

with q as (
      <whatever generates the data you have shown>
     )
select q.*,
       (sum(sales_rate) over (order by date
                              rows between 2 preceding and 1 preceding
                             ) /
        nullif(count(*) over (order by date
                              rows between 2 preceding and 1 preceding
                             )
       ) as two_month_average
from q;

Вы также можете express это используя case и avg():

select q.*,
       (case when row_number() over (order by date) > 2)
             then avg(sales_rate) over (order by date
                                        rows between 2 preceding and 1 preceding
                                       )
        end) as two_month_average
from q;
0 голосов
/ 25 марта 2020

Как прокомментировал a_horse_with_no_name, вы можете использовать оконные функции для получения среднего значения двух предыдущих месяцев с помощью предложения range:

select 
    date,
    count(sales)::numeric/count(poss_sales) as Sales_Rate,
    avg(count(sales)::numeric/count(poss_sales)) over(
        order by date
        rows between '2 month' preceding and '1 month' preceding
    ) Sales_Rate,
    count(sales)::numeric/count(poss_sales) as Sales_Rate 
        - avg(count(sales)::numeric/count(poss_sales)) over(
            order by date
            rows between '2 month' preceding and '1 month' preceding
        ) PercentDeviation
from data
where date between '2019-07-01' and '2019-12-31'
group by date
order by date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...