如何在 table 中找到一系列没有间隙的序号

How to find a ranges of sequential numbers without gaps in a table

我试图在按不同标识符分组的 table 中查找没有特定值的数字范围。 如果我有这样的 table:

ID | Type | Bad Value  | Bad Value 2
4  |  a   |    0       |     0
5  |  a   |    0       |     0
6  |  a   |    0       |     0
7  |  a   |    0       |     1
8  |  a   |    1       |     0
9  |  a   |    0       |     0
2  |  b   |    0       |     0
3  |  b   |    0       |     0
4  |  b   |    1       |     0
5  |  b   |    1       |     1
6  |  b   |    0       |     0
7  |  b   |    0       |     0
6  |  c   |    0       |     0
7  |  c   |    0       |     1
8  |  c   |    1       |     0
9  |  c   |    0       |     0

我想得到这样的输出:

FROM  |  TO  | Group
4     |  6   |   a
9     |  9   |   a
2     |  3   |   b
6     |  7   |   b
6     |  6   |   c
9     |  9   |   c

我找到了类似的解决方案 here,但其中 none 可以在 Oracle 中使用。我收到一个错误,缺少表达式错误。 有没有办法去做这件事?有问题的 table 将包含数十万个条目。

您需要确定相同的组。这个有一个技巧,就是行号的不同。

select min(id) as fromid, max(id) as toid, type
from (select t.*,
             (row_number() over (partition by type order by id) -
              row_number() over (partition by type, badvalue order by id)
             ) as grp
      from table t
     ) grp
where badvalue = 0
group by grp, type;

这里有一个细微差别,因为您似乎只需要 "bad value" 为 0 的行。请注意,此条件位于外部 select,因此它不会干扰 row_number()计算。