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 - 窗口函数 - 插入和更新输出的滞后和领先