我正在尝试创建一个查询,该查询将计算多个指标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
答案 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
;
希望有帮助。