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

Posted

技术标签:

【中文标题】SQL - 使用窗口函数创建滞后变量【英文标题】:SQL - lag variable creation using window function 【发布时间】:2020-10-12 16:26:14 【问题描述】:

我有一些每日城市级别的数据。我必须在每月级别(每月的第一天)汇总这些数据,然后根据从每月第一天开始的最后 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 天创建滞后变量?

【问题讨论】:

选择一个 DBMS(mysql 和 SQL Server 差别太大)。指定精确的 DBMS 版本。提供示例数据作为在线小提琴(或 CREATE TABLE + INSERT INTO 脚本)。为该数据提供所需的输出并提供详细说明。 使用窗口函数根据过去 7、14、21、28 天创建滞后变量 使用 RANGE 而不是 ROWS。 【参考方案1】:

你可以用这个L

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

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

【讨论】:

【参考方案2】:

我认为您正在寻找这样的东西。第一个 cte 将城市计数汇总到日、周、月、年。第二个总结了周、月、年的计数。要从第一天开始按周对销售额进行分组,它使用 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;

【讨论】:

以上是关于SQL - 使用窗口函数创建滞后变量的主要内容,如果未能解决你的问题,请参考以下文章

Spark 1.5.0 (PySpark) 案例当逻辑和滞后窗口函数

基于另一列的滞后窗口函数

Spark Dataframe - 窗口函数 - 插入和更新输出的滞后和领先

创建“部分”窗口函数以更新 SQL Server 中的数据

如何在 MySQL 中为每个类别创建一个 SQL 窗口函数列?

带有窗口函数的 PySpark 数据偏度