【问题标题】:SQL - lag variable creation using window functionSQL - 使用窗口函数创建滞后变量
【发布时间】: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。

标签: sql


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 2015-02-16
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多