如何在表中找到没有间隙的序列号范围

时间:2015-07-29 21:17:26

标签: sql database oracle gaps-and-islands

我试图在由不同标识符分组的表中找到没有特定值的数字范围。 如果我有一张这样的桌子:

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,但它们都没有在Oracle中运行。我得到一个错误表达式错误。 有办法去做吗?有问题的表格中有数十万个条目。

1 个答案:

答案 0 :(得分:0)

您需要识别相同的组。有一个技巧,这是行数的差异。

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;

这里有一个细微差别,因为你似乎只想要排在哪里"糟糕的价值"注意,此条件位于外部选择中,因此它不会干扰row_number()计算。