在应该连续序号的序列中查找首个缺失项
例题描述和简单分析
某数据库中有表BOOK_CAPTER,数据如下所示:
BOOK_ID |
CAPTER_INTERNAL_NUMBER |
1 |
1 |
1 |
2 |
1 |
5 |
2 |
1 |
2 |
2 |
2 |
3 |
3 |
7 |
3 |
9 |
需要在每个BOOK_ID 组内,找出连续序号的序列(CAPTER_INTERNAL_NUMBER
)的首个缺失项,结果如下:
BOOK_ID |
NUM |
1 |
3 |
2 |
4 |
3 |
1 |
解法及简要说明
在集算器中编写脚本p1.dfx,如下所示:
A |
|
1 |
=connect("demo") |
2 |
=A1.query@x("SELECT * FROM BOOK_CAPTER ORDER BY BOOK_ID,CAPTER_INTERNAL_NUMBER") |
3 |
=create(BOOK_ID,NUM) |
4 |
>A2.run(if(A3.select@1(ID==A2.ID),,if(ID!=ID[-1] && N!=1,A3.insert(0,A2.ID,1),if(ID==ID[-1] && N>N[-1]+1,A3.insert(0,A2.ID,N[-1]+1),if(ID!=ID[+1],A3.insert(0,A2.ID,N+1))))) ) |
简要说明:
A1 连接数据源名称为 demo 的数据库
A2 返回查询结果所组成的序表,结束时自动关闭数据库连接
A3 创建结果表,空序表(BOOK_ID,NUM)
A4 遍历 A2,若当前 ID 已经存在于结果表(A3)中,继续判断下一条记录,否则,若当前 ID 不等于上一条记录的 ID 并且当前 N 不为 1,A3 追加记录 [当前 ID,1],否则,若当前 ID 不等于上一条记录的 ID 并且当前 N 与上一条记录的 N 不连续, A3 追加记录 [当前 ID,上一条记录的 N+1],否则,若当前 ID 不等于下一条记录的 ID,A3 追加记录 [当前 ID,当前 N+1]。
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
https://stackoverflow.com/questions/64144082/find-first-available-value-that-doesnt-exist
英文版