如何在 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()
计算。
我试图在按不同标识符分组的 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()
计算。