0

对于 SQL 查询/存储过程,我希望在一段时间内按类型查找给定值的峰值总和。此外,如果峰值在给定时间段内没有下降趋势,则不应计算在内。

数据,例如:

类型 数量 日期
AAA 10 2021-07-11
AAA 15 2021-07-11
AAA 20 2021-07-11
AAA 25 2021-07-11 *需要这个高峰
AAA 20 2021-07-11
AAA 15 2021-07-11
AAA 10 2021-07-11
AAA 15 2021-07-11
AAA 20 2021-07-11
AAA 25 2021-07-11
AAA 30 2021-07-11 *需要将此峰值添加到上一个峰值
AAA 20 2021-07-11
AAA 15 2021-07-11
AAA 10 2021-07-11
BBB 10 2021-07-11
BBB 20 2021-07-11
BBB 30 2021-07-11 *需要这个高峰
BBB 20 2021-07-11
BBB 10 2021-07-11
CCC 10 2021-07-11
CCC 20 2021-07-11
CCC 30 2021-07-11
CCC 20 2021-07-11
CCC 10 2021-07-11
CCC 20 2021-07-11
CCC 30 2021-07-11
CCC 40 2021-07-11 *此高峰不计算在内,因为下降趋势发生在第二天
CCC 30 2021-07-12
CCC 20 2021-07-12
CCC 10 2021-07-12

给定日期 2021-07-11 的结果应该是:

类型 全部的
AAA 55
BBB 30

(不包括 CCC,因为在给定日期没有下降趋势)

我什至不知道从哪里开始,除了可能获得每行的值,其后一行的值较小(开始下降)。

4

2 回答 2

1

让我假设您的date专栏有一个时间组件。您实际上需要对行进行显式排序,而日期还不够。

如果是这样,您可以使用lead()and lag()

select t.*
from (select t.*,
             lag(amount) over (partition by type, convert(date, date) order by date) as prev_amount,
             lead(amount) over (partition by type, convert(date, date) order by date) as next_amount
      from t
     ) t
where prev_amount < amount and amount > next_amount;

编辑:

对于最终聚合:

select type, sum(amount)
from (select t.*,
             lag(amount) over (partition by type, convert(date, date) order by date) as prev_amount,
             lead(amount) over (partition by type, convert(date, date) order by date) as next_amount
      from t
     ) t
where prev_amount < amount and amount > next_amount;
group by type;
于 2021-07-12T00:46:54.243 回答
0

鉴于当前的表结构,这是不可能的。您至少需要另一列来指示每条记录的顺序。否则查询将无法保证

AAA 10  2021-07-11

总会来之前

AAA 15  2021-07-11

没有迹象表明为什么第二个比第一个晚。

于 2021-07-12T00:27:59.950 回答