sql - 如何对不同的时间间隔求和以找到多年峰值
问题描述
我正在尝试查找历史上连续多年的商品销售高峰。我的问题是一些项目过去已售出并停产,但仍需要成为分析的一部分。例如:
我已经在 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 年的总和)。
解决方案
在 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;
推荐阅读
- regex - VSCode 扩展:编译器输出与空行匹配的问题
- node.js - 未处理的错误类型错误:无法读取未定义的属性“创建”
- python - 无法在 python3 数据库、NoneType 对象上编辑类信息
- vb.net - 试图删除文本文件中的一行-VB
- java - Android:如何为数据容器创建基于 XML 的文件,从文件中读取/添加内容
- laravel - 如何获取与 Laravel 的 3 个模型多对多关系的数据?
- php - 干预图像。获取 md5 哈希
- javascript - .toLowerCase() / .toUpperCase() 不工作
- swift - 使用 JSON 对象中的键解析数据并显示为列表
- python - pycharm或其他产品有没有类似gitlens的插件?