首页 > 解决方案 > 如何对不同的时间间隔求和以找到多年峰值

问题描述

我正在尝试查找历史上连续多年的商品销售高峰。我的问题是一些项目过去已售出并停产,但仍需要成为分析的一部分。例如:

我已经在 r 中完成了一些 for 循环,但是我不确定如何解决总结多个连续年份并将其与同一数据集中的其他局部最大值进行比较的问题。

Year      Item            Sales
2001      Trash Can       100
2002      Trash Can       125
2003      Trash Can       90
2004      Trash Can       97
2002      Red Balloon     23
2003      Red Balloon     309
2004      Red Balloon     67
2005      Red Balloon     8
1998      Blue Bottle     600
1999      Blue Bottle     565

根据以上数据,如果要计算 2 年的销售高峰,我想输出蓝瓶 1165(1998 年和 1999 年之和)、红气球 376(2003 年和 2004 年之和)和垃圾桶 225(和2001 年和 2002 年)。但是,如果我想要一个 3 年的峰值,那么蓝瓶将不符合条件,因为它只有 2 年的数据。

如果我想计算 3 年的销售高峰,我想输出 Red Balloon 399(2002 年到 2004 年的总和)和 Trash Can 315(2001 年到 2003 年的总和)。

标签: sqlr

解决方案


在 SQL 中,您可以使用窗口函数。对于符合条件的 2 年销售:

    select item, sales, year
    from (select t.*,
                 sum(sales) over (partition by item order by year rows between 1 preceding and current row) as two_year_sales,
                 row_number() over (partition by item order by year) as seqnum
          from t
         ) t
    where seqnum >= 2;

并获得高峰:

select t.*   
from (select item, two_year_sales, year,
             max(two_year_sales) over (partition by item) as max_two_year_sales
      from (select t.*,
                   sum(sales) over (partition by item order by year rows between 1 preceding and current row) as two_year_sales,
                   row_number() over (partition by item order by year) as seqnum
            from t
           ) t
      where seqnum >= 2
     ) t
where two_year_sales = max_two_year_sales;

推荐阅读