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