SQL,甲骨文更新表让我们假设我们有这样一个表:使用递归性
+--------+------------+---------------+----------------+
| Name | Position | Initial Date | Final Date |
+--------+------------+---------------+----------------+
| XXX | 1 | 2016/06/07 | 2016/06/08 |
| XXX | 2 | 2016/06/08 | 2016/06/09 |
| XXX | 3 | 2016/06/09 | 2016/06/10 |
| XXX | 4 | 2016/06/13 | 2016/06/14 |
| XXX | 6 | 2016/06/14 | 2016/06/15 |
| YYY | 1 | 2016/06/02 | 2016/06/03 |
+--------+------------+---------------+----------------+
我想更新添加新的字段,指示一组的第一个位置。 形成一个基团的一部分是指遵循以下规则:
- 共享相同的名称
- 位置编号必须是关联度(例如:位置4和6需要的数5,创建的基团)。
- 第一行的最后日期必须与第二行的最后日期重合,依此类推。
拥有这一切的考虑,这应该是结果:
+--------+------------+---------------+----------------+------------+
| Name | Position | Initial Date | Final Date | New field |
+--------+------------+---------------+----------------+------------+
| XXX | 1 | 2016/06/07 | 2016/06/08 | 1 |
| XXX | 2 | 2016/06/08 | 2016/06/09 | 1 |
| XXX | 3 | 2016/06/09 | 2016/06/10 | 1 |
| XXX | 4 | 2016/06/13 | 2016/06/14 | 4 |
| XXX | 6 | 2016/06/14 | 2016/06/15 | 6 |
| YYY | 1 | 2016/06/02 | 2016/06/03 | 1 |
+--------+------------+---------------+----------------+------------+
我可以把它只有2个成员组的工作,但我不知道如何处理它更比2成员的情况。
这是我使用的一个示例代码,显然不适用于大团体。
update table1 f1
set f1.new_field = NVL((select f2.position
from table1 f2
where f1.name = f2.name and
f2.position = f1.position+1 and
f1.final_date = f2.initial_date),f1.position);
我应该使用递归查询来解决这个问题吗?在这种情况下,我不知道如何在SQL中实现它。
任何帮助,非常感谢!
谢谢@Boneist为您快速回复。我在更新中使用它,它绝对对我有用。我甚至不知道这个lag()函数的存在。 – Roy90
分析函数是非常有用的野兽;如果你还没有,我强烈建议你看看他们并与他们一起玩。他们非常强大* {:-)另外,我认为@MT0的解决方案可能比我的解决方案更快,所以我建议您测试两种数据,并查看哪一个性能最好。 – Boneist