如何解决查找不存在的第一个可用值
我想为书籍章节创建表格,其中pk将为book_id
和chapter_internal_number
。我不确定如何为新章节插入找到下一个可用的chapter_internal_number
值(可以删除每章,并且应重新使用其chapter_internal_number
值)。
如何查找第一本书的Chapter_internal_number可用值?可用值是按ASC顺序不存在的下一个值。
表格book_chapter:
| pk | pk |
| book_id | chapter_internal_number |
| 1 | 1 |
| 1 | 2 |
| 1 | 5 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
预期:
- 对于book_id = 1为3
- 对于book_id = 2是4
解决方法
基本上,您希望每本书的章节编号中都包含第一个空白。我认为您不需要generate_series()
;您可以使用lead()
将当前章节与下一章进行比较:
select book_id,min(chapter_internal_number) + 1
from (
select bc.*,lead(chapter_internal_number) over(partition by book_id order by chapter_internal_number) lead_chapter_internal_number
from book_chapter bc
) bc
where lead_chapter_internal_number is distinct from chapter_internal_number + 1
group by book_id
这似乎是查询语句的最自然方法,我怀疑用generate_series()
枚举所有可能的值应该更有效(我想知道两种解决方案相对于大数据集)。
我们还可以在外部查询中使用distinct on
而不是聚合:
select distinct on (book_id) book_id,chapter_internal_number + 1
from (
select bc.*,lead(chapter_internal_number) over(partition by book_id order by chapter_internal_number) lead_chapter_internal_number
from book_chapter bc
) bc
where lead_chapter_internal_number is distinct from chapter_internal_number + 1
order by book_id,chapter_internal_number
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。