比较下一行中的值并更新当前行| Oracle SQL

比较下一行中的值并更新当前行| Oracle SQL,sql,oracle,Sql,Oracle,我的数据库中有以下格式的数据: 名称值开始\u周结束\u周 姓名1 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19 姓名1 1_2_2_1_2_2_1 29-Dec-19 04-Jan-20 姓名1 1_2_2_2_2_1 05-Jan-20 11-Jan-20 姓名1 1_2_2_2_2_1 12-Jan-20 18-Jan-20 姓名1 1_2_2_2_2_1 19-Jan-20 25-Jan-20 姓名1 1_2_2_2_2_1 26-Jan-20 01-Feb-20

我的数据库中有以下格式的数据:

名称值开始\u周结束\u周
姓名1 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
姓名1 1_2_2_1_2_2_1 29-Dec-19 04-Jan-20
姓名1 1_2_2_2_2_1 05-Jan-20 11-Jan-20
姓名1 1_2_2_2_2_1 12-Jan-20 18-Jan-20
姓名1 1_2_2_2_2_1 19-Jan-20 25-Jan-20
姓名1 1_2_2_2_2_1 26-Jan-20 01-Feb-20
姓名1 1_2_2_2_2_1 02-Feb-20 08-Feb-20
姓名1 1_2_2_2_2_1 09-Feb-20 15-Feb-20
姓名1 1_2_2_2_2_1 16-Feb-20 22-Feb-20
姓名1 1_2_2_2_2_1 23-Feb-20 29-Feb-20
姓名1 1_2_2_2_2_1 01-Mar-20 07-Mar-20
姓名2 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
姓名2 1_2_2_2_2_2_2 29-Dec-19 04-Jan-20
姓名2 1_2_2_2_2_2 05-Jan-20 11-Jan-20
姓名2 1_2_2_2_2_2 12-Jan-20 18-Jan-20
姓名2 1_2_2_2_2_2 19-Jan-20 25-Jan-20
姓名2 1_2_2_2_2_2_2 26-Jan-20 01-Feb-20
姓名2 1_2_2_2_2_2 02-Feb-20 08-Feb-20
姓名2 1_2_2_2_2_2_2 09-Feb-20 15-Feb-20
姓名2 1_2_2_2_2_2_2 16-Feb-20 22-Feb-20
姓名2 1_2_2_2_2_2_2 23-Feb-20 29-Feb-20
姓名2 1_2_2_2_2_2 01-Mar-20 07-Mar-20
我需要比较每个name列的values列,并更新每周的结束时间。例如,第一行和第二行的列值不同,因此无需更新“每周结束”列。第三列和第四列具有相同的值列,因此第四行的周末应该为第三行更新,结果如下所示

然后,应将此行与下一行进行比较,如果“值”列相同,则应从下一行获取“周末”,并在此行中进行更新。这应该发生在每个名称列值的每一组行上

我尝试使用
lead()
函数比较行,但无法与更新后的下一组行进行比较

名称值开始\u周结束\u周
姓名1 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
姓名1 1_2_2_1_2_2_1 29-Dec-19 04-Jan-20
姓名1 1_2_2_2_2_1 05-Jan-20 07-Mar-20
姓名2 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
姓名2 1_2_2_2_2_2_2 29-Dec-19 07-Mar-20

这是一个缺口和孤岛问题。一个简单的解决方案是行号的差异:

select name, value,
       min(week_start), max(week_end)
from (select t.*,
             row_number() over (partition by name order by week_start) as seqnum,
             row_number() over (partition by name, value order by week_start) as seqnum_2
      from t
     ) t
group by name, value, (seqnum - seqnum_2);

为什么这样做有点难解释。但是,如果您查看子查询的结果,您将看到行号的差异如何识别具有相同值的相邻行。

查看示例数据,我认为这不是一个缺口和孤岛问题。您可以使用
分组方式
实现所需的输出

Select name, value,
       Min(start_of_week),
       Max(end_of_week)
From your_table
Group by name, value;

干杯

如果我有如下一行:``名称值开始\周结束\周结束\周名称1 \ 2 \ 2 \ 2 \ 2 \ 1 15-DEC-2019 21-DEC-2019 21-DEC``那么我应该得到四行作为名称1的输出
名称值开始\周结束\周名称1 \ 2 \ 2 \ 2 \ 1 15-DEC-19 21-DEC-19 1 1 \ 2 \ 2 \ 1 \ 1 \ 2 \ 1 \ 2 \ 1 \ 2 \ 2 \ 1 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 2 \ 2 \ 2 \ 1 \ 2 \ 2 \ 1 \但是我只会得到如下3行:
名称值开始于周结束于周结束于周名称1\u 2\u 2\u 2\u 2\u 2\u 1 05-Jan-20 07-Mar-201_2_2 我相信这应该行得通。让我尝试其他场景并测试它。非常感谢!