在我的例子中,我们有一个表 ABC,其中应该有 1 行。
ID | 姓名 | 开始日期 | 结束日期 |
---|---|---|---|
1 | 拉胡尔 | 2021 年 1 月 1 日 | 2021 年 6 月 1 日 |
但是在检索时,我想获得多行,其中开始日期递增 1,直到它小于或等于结束日期。
ID | 姓名 | 开始日期 | 结束日期 |
---|---|---|---|
1 | 拉胡尔 | 2021 年 1 月 1 日 | 2021 年 6 月 1 日 |
1 | 拉胡尔 | 2021 年 2 月 1 日 | 2021 年 6 月 1 日 |
1 | 拉胡尔 | 2021 年 3 月 1 日 | 2021 年 6 月 1 日 |
1 | 拉胡尔 | 2021 年 4 月 1 日 | 2021 年 6 月 1 日 |
1 | 拉胡尔 | 2021 年 5 月 1 日 | 2021 年 6 月 1 日 |
1 | 拉胡尔 | 2021 年 6 月 1 日 | 2021 年 6 月 1 日 |
请让我知道我们该怎么做。
你可以通过几种方式来做到这一点(下面的所有代码都可以在 fiddle here上找到)。
使用 GENERATE_SERIES 的解决方案:
对于初学者,我插入了更多记录以使用例更加真实,我还在表中添加了一些合理的约束。
填充它:
然后我运行了以下查询:
结果(为简洁起见 - 见小提琴):
仅连续两天的“边缘案例”也很有效:
我对我的解决方案与@Akina 提供的另一个解决方案进行了性能分析,虽然我的解决方案似乎有更多的操作,但它始终比他的更快(通常约 2/3 的时间 - 虽然偶尔,我的速度较慢) . 看这里的小提琴。
现在,当我们只查看我们无法控制的服务器上的 7 条记录时,不可能正确地对解决方案进行基准测试 - 机器上的其他地方发生了什么?我会敦促您使用您自己的(测试)系统测试任何选择的解决方案,以澄清这一点,让您自己满意。
使用递归 CTE (RCTE) 的解决方案:
另一个有趣的解决方案也存在使用
RCTE
如下:结果:
性能分析:
我在fiddle
EXPLAIN (ANALYZE, BUFFERS)
中包含了两个查询的输出。如您所见,GENERATE_SERIES 查询占用了 RCTE 大约 50% 的时间。那么,您可能会问,为什么有人会为 RCTE 烦恼呢?好吧,它们非常强大,它们允许程序员向他们的查询添加复杂的逻辑——我敦促你去探索它们——也许不适合这种情况,但对于未来的场景来说,它们值得牢记。
ps 欢迎来到 dba.se。为了将来参考,请不要在此处和StackOverflow上发布相同的问题。
数据库问题在这里非常重要。如果您提出了问题并且在合理的时间内没有收到回复,请随时在其他地方提问,但是,在这种情况下,请将旧问题的链接添加到新问题以避免重复工作!
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=1f64e23f35bc9539cff6f9c93a2290cb