我有一个数据库表,文档名称存储为VARCHAR,我需要一种方法来确定最低可用序列号是什么。有很多差距。
name partial seq
A-B-C-0001 A-B-C- 0001
A-B-C-0017 A-B-C- 0017
在上面的示例中,它将是0002。
不同的名称值总计227,705。 “部分”组合的数量非常大A = 150,B = 218,C = 52,因此有1,700,400种潜在组合。
我找到了一种方法,可以从每个不同的值的最小值到最大值进行迭代,并列出所有“缺失”(也称为可用)值,但这似乎效率低,因为我们没有使用接近最大潜在部分组合的任何地方(10,536个) 1,700,400)。
我宁愿根据具有部分值的现有数据创建一个表,它是下一个可用的序列值,而不存在的部分意味着0001。
由于
答案 0 :(得分:0)
select coalesce(min(to_number(seq)), 0) + 1
from t
where partial = 'A-B-C-' and
not exists (select 1
from t t2
where t2.partial = t.partial and
to_number(T2.seq) = to_number(t.seq) + 1
);
编辑:
对于所有部分内容,您需要group by
:
如有必要,您可以使用to_char()
将其转换回字符。
select partial, coalesce(min(to_number(seq)), 0) + 1
from t
where not exists (select 1
from t t2
where t2.partial = t.partial and
to_number(T2.seq) = to_number(t.seq) + 1
)
group by partial;