Оконные функции для расчета метрик MTD - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь создать запрос, который бы вычислял количество метрик MTD.Поэтому, если бы я хотел рассчитать доход 12 декабря, он бы суммировал все дни между 1 декабря и 12 декабря.

Если бы я хотел сравнить рост выручки за два месяца, то сравнил бы этот интервал с 1-го ноября по 12-е ноября.

Я пытался использовать оконные функции, чтобы сделать именно это.

select ms.date, ms.market, 
sum(ms.rev) as "rev_this_month",
lag(sum(ms.rev)) over (partition by ms.market order by ms.date) as "last_month_rev",

(sum(ms.rev) - (cast((lag(sum(ms.rev)) over 
(partition by ms.market order by ms.date))as float)))/ 
cast((lag(sum(ms.rev)) over 
(partition by ms.market order by ms.date))as float) as "MTD_rev_growth"

From market_sales ms

where 
a.date between trunc(DATE_TRUNC('day', current_date)) - interval '30 day'
 and trunc(DATE_TRUNC('day', current_date))

И я бы ожидал что-то вроде этого:

Date       | Market | Rev_this_month | Rev_last_month | MTD
2018-12-12     Aus         10                5                1.0
2018-12-12     SF          40               40                 0
2018-12-12     PA          10               20               -0.50

Но вместо этого я получаю

Date       | Market | Rev_this_month | Rev_last_month | MTD_Rev_growth
2018-12-12     Aus         10                5                1.0
2018-12-11     Aus         5                 2                 x
2018-12-10     Aus         2                 0                 x
...
2018-12-12     SF         40                 40                0
2018-12-11     SF         40                 20               1.0

и т. Д.

Этосвязанные с моими оконными функциями или это как я фильтрую вещи в предложении where?

Буду признателен за любую помощь.

РЕДАКТИРОВАТЬ:

Извинения за опоздание, Ушелкемпинг.В любом случае вот некоторые примеры данных на основе запроса:

Market | Date        | Rev
Aus      2018-01-03    55
SF       2018-01-04    33
SF       2018-01-20    04
PA       2018-01-21    60
BAL      2018-01-29    70
SF       2018-02-12    31

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Основываясь на вашем описании и ожидаемых результатах, вы когда-нибудь захотите сравнить текущий месяц с тем же количеством дней в прошлом месяце ...

WITH
  data_window AS
(
  SELECT
    *,
    CASE WHEN market_sales.date >= DATE_TRUNC('month', CURRENT_DATE) THEN 1 ELSE 0 END   AS is_this_month
  FROM
    market_sales
  WHERE
        market_sales.date >= DATEADD('month', -1, DATE_TRUNC('month', CURRENT_DATE))
    AND DATE_PART('day', market_sales.date) <= DATE_PART('day', CURRENT_DATE)
)
SELECT
  CURRENT_DATE   AS date,
  market,
  SUM(CASE WHEN is _this_month = 1 THEN rev ELSE 0 END)  AS rev_this_month,
  SUM(CASE WHEN is _this_month = 0 THEN rev ELSE 0 END)  AS rev_last_month,
  CAST(SUM(CASE WHEN is _this_month = 1 THEN rev ELSE 0 END) AS FLOAT)
  /
  SUM(CASE WHEN is _this_month = 0 THEN rev ELSE 0 END)
  - 1.0
                                                         AS mtd_rev_growth
FROM
  data_window
GROUP BY
  market
0 голосов
/ 15 декабря 2018

Я ничего не знаю о amazon-redshift, но собираюсь для sql, проверьте, можете ли вы включить этот дополнительный столбец в select:

row_number() OVER (PARTITION BY ms.market ORDER BY ms.date) as rownumber

Затем вы выбираете из своего запросавот так:

SELECT *
FROM
(
  -- your select here...
)
WHERE 1=1
  AND rownumber = 1
;

Надеюсь, это поможет.

...