窗口函数来计算MTD指标

时间:2018-12-14 21:57:56

标签: sql amazon-redshift

我正在尝试创建一个查询,该查询将计算多个指标MTD。因此,如果我想计算12月12日的收入,那么它将汇总12月1日至12月12日之间的所有天数。

如果我想比较两个月之间的收入增长,则可以将该间隔与11月1日至11月12日进行比较。

我一直在尝试使用窗口函数来做到这一点。

'str'

我期望这样的事情:

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

以此类推。

它与我的窗口函数有关还是在where子句中过滤内容?

不胜感激。

编辑:

道歉,迟到了,去露营了。无论如何,这是一些基于请求的示例数据:

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

2 个答案:

答案 0 :(得分:1)

根据您的描述和显示的预期结果,您只想将到目前为止的当月与上个月的相同天数进行比较...

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

答案 1 :(得分:0)

我对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
;

希望有帮助。