问题描述
我这样查询一个数据帧:
Select
Date,Department,cumu_revenue_yr,LAG(cumu_revenue_yr,1) OVER (
PARTITION BY Department
ORDER BY Date) as previous_cumu_revenue_yr,(cumu_revenue_yr - previous_cumu_revenue_yr) as 1day_revenue
from dmf_dbo.revenue
cumu_revenue_yr是从一年的第一天到今天的累计收入。
但是,如果我想再增加一列以显示从每个月初到现在(当前cumu_revenue_yr-前一个月底cumu_revenue_yr)的收入,我该怎么做?
我尝试做类似的事情:
Select
Date,(cumu_revenue_yr - previous_cumu_revenue_yr) as 1day_revenue,Day(Date)) OVER (
PARTITION BY Department
ORDER BY Date) as previous_monthend_cumu_revenue,(cumu_revenue_yr - previous_monthend_cumu_revenue) as whole_month_revenue,from dmf_dbo.revenue
但是有两个问题:
- LAG()仅在第二个参数中接受正整数。
- 时间序列是营业日。换句话说,在周末或假日将没有数据记录。因此,使用LAG(cumu_revenue_yr,Day(Date))不能帮助我提取正确的数据。
有人有什么建议吗? 最终的数据帧应该看起来像
解决方法
这是2个查询。第一个查询是我认为如何返回第一组数据。第二个查询会添加每月的累计运行1day_revenue
/* Query */
Select [Date],Department,cumu_revenue_yr,(cumu_revenue_yr - LAG(cumu_revenue_yr,1) OVER (
PARTITION BY Department
ORDER BY Date)) as [1day_revenue]
from dmf_dbo.revenue;
[EDIT] LAG功能在CTE中运行。然后访问CTE以计算年,月分区的总和。
/* Query with SUM() OVER */
;with lag_cte([Date],[1day_revenue]) as (
Select [Date],1) OVER (
PARTITION BY Department
ORDER BY Date))
from dmf_dbo.revenue)
Select *,sum(cumu_revenue_yr-[1day_revenue]) over
(partition by year([Date]),month([Date])
order by [Date]) as cumu_revenue_month
from lag_cte;
,
您可以为此使用apply
select r2.*,r.cumu_revenue_yr - coalesce(r2.cumu_revenue_yr,0) as mtd
from dmf_dbo.revenue r outer apply
(select top (1) r2.*
from dmf_dbo.revenue r2
where r2.department = r.department and
year(r2.date) = year(r.date) and
r2.date < datefromparts(year(r.date),month(r.date),1)
order by r2.date desc
) r2