SQL 查询 - 计算值大于 X 的连续行数

Posted

技术标签:

【中文标题】SQL 查询 - 计算值大于 X 的连续行数【英文标题】:SQL Query - Count number of consecutive rows with value above X 【发布时间】:2021-03-03 17:39:20 【问题描述】:

我遇到了一个问题,希望得到一些指导。我们希望生成一份报告,计算产品的连续日期数(从用户提供的日期向后看)。数据集如下:

Product, InventoryDate, InventoryQuantity
A, 3/1/2021, 123
B, 3/1/2021, 98
C, 3/1/2021, 101
A, 2/22/2021, 115
B, 2/22/2021, 99
C, 2/22/2021, 105
A, 2/15/2021, 150
B, 2/15/2021, 105
C, 2/15/2021, 50

因此,我们想提取一份报告,内容如下,提供日期为 2021 年 3 月 2 日:

Product, CurrentInventory, PreviousWeeksCountAbove100
A,123,2
B,98,0
C,101,1

尽管我在努力编写查询,但我什至不知道该怎么称呼它,因为我需要对超过特定阈值的连续值进行计数。我可以计算高于阈值的值,但不确定如何添加“连续几周”逻辑。

【问题讨论】:

您可以使用窗口函数来执行此操作。具体的数据库是什么? 你要的是什么 DBMS? 【参考方案1】:

您可以使用窗口函数。根据从末尾开始计数值低于 X 的行数分配一个组。然后过滤聚合:

select product,
       sum(case when grp = 0 and val > 100 then 1 else 0 end) as consecutive_weeks
from (select t.*,
             sum(case when val <= 100 then 1 else 0 end) over (partition by product order by inventorydate desc) as grp
      from t
      where inventorydate <= ?
     ) t
group by product;

【讨论】:

以上是关于SQL 查询 - 计算值大于 X 的连续行数的主要内容,如果未能解决你的问题,请参考以下文章

SQL:检测具有相同键的连续行的连续块

每个客户的连续行之间的Haversine距离

在具有特定值的连续行上定义一个窗口

使用给定的一组索引访问 numpy 数组的连续行

pandas:将具有相同值的连续行分组为一组

计算同一列之间的差异,在python中由另一列分组的连续行