SQL - 通过条件对行进行分组,直到找到异常

use*_*428 5 sql sql-server sql-server-2008

我正在尝试根据某些条件将数据列添加到数据集.举个简单的例子:

?????????????
? ID ? DATA ?
?????????????
?  1 ?   12 ?
?  2 ?   20 ?
?  3 ?    3 ?
?  4 ?   55 ?
?  5 ?   11 ?
?????????????
Run Code Online (Sandbox Code Playgroud)

假设我们的标准是数据应该大于10.那么结果应该类似于:

?????????????????????
? ID ? DATA ? GROUP ?
?????????????????????
?  1 ?   12 ?     1 ?
?  2 ?   20 ?     1 ?
?  3 ?    3 ?     2 ?
?  4 ?   55 ?     3 ?
?  5 ?   11 ?     3 ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

因此,在标准发生异常之前满足条件的所有行都成为组的一部分.该组的编号不一定需要遵循这种模式,我只是觉得这是一个逻辑/简单的编号来解释我正在寻找的解决方案.

Gor*_*off 1

您可以通过查找 data <= 10 的每一行来计算组标识符。然后,组标识符只是给定行之前条件为 true 的行数。

select t.*,
       (select count(*)
        from t t2
        where t2.id <= t.id and
              t2.data <= 10
       ) as groupId
from t;
Run Code Online (Sandbox Code Playgroud)

SQL Server 2012具有累积和语法。该语句在该数据库中会更简单:

select t.*,
       sum(case when t2.data <= 10) over (order by id) as groupId
from t;
Run Code Online (Sandbox Code Playgroud)

编辑:

上述没有考虑到小于10的值在它们自己的组中。上面的逻辑是他们开始一个新的组。

以下代码分配具有此约束的组 id:

select t.*,
       ((select 2*count(*)
         from t t2
         where t2.id < t.id and
               t2.data <= 10
        ) + (case when t.id <= 10 then 1 else 0 end)
       ) as groupId
from t;
Run Code Online (Sandbox Code Playgroud)