繁体   English   中英

SQL - 使用窗口函数创建滞后变量

[英]SQL - lag variable creation using window function

我每天都有一些城市级别的数据。 我必须按月级别(每个月的第一天)汇总这些数据,然后根据从一个月的第一天开始的最后 1 周创建滞后变量。

输入数据

我使用以下代码创建了过去 1 个月的滞后变量(在按月级别汇总数据之后(每月的第一个日期)

sum(count) over (partition by City order by month_date rows between 1 preceding  and 1 preceding) as last_1_month_count

有没有办法使用窗口函数按月汇总数据并根据过去 7、14、21、28 天创建滞后变量?

你可以用这个L

select 
    CITY
    , month(Date)
    , year(date)
    , sum(count)

from table1
where date < Datediff(days , 7 , getdate())
group by 
    City
    , month(Date)
    , year(date)

我想你正在寻找这样的东西。 第一个 cte 将城市计数汇总到日、周、月、年。 第二个总结了周、月、年的计数。 要从第 1 天开始按周对销售额进行分组,它使用 DAY 函数以及 YEAR 和 MONTH。 由于 DAY 返回整数,因此可以通过除以 7 来创建不同周的组,即 DAY(day_dt)/7。

获得前一周销售额的一种方法是将周销售额摘要 cte 加入到自身中,其中一周被 -1 抵消。 由于前一周可能有 0 个销售,因此 LEFT JOIN 似乎比使用 LAG imo 更安全

with 
day_sales_cte(city, day_dt, yr, mo, wk, sum_count) as (
    select city, day_dt, year(day_dt), month(day_cte), day(day_dt)/7, sum([count]) sum_counts
    from city_level_data
    group by city, day_dt, year(day_dt), month(day_cte), day(day_dt)/7)
wk_sales_cte(city, yr, mo, wk, sum_count) as (
    select city, yr, mo, wk, sum(sum_counts) sum_counts
    from sales_cte
    group by city, yr, mo, wk)
select ws.*, ws2.sum_sales prior_wk_sales
from wk_sales_cte ws
     left join wk_sales_cte ws2 on ws.city=ws2.city
                                   and ws.yr=ws2.yr
                                   and ws.mo=ws2.mo
                                   and ws.wk=ws.wk-1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM