我的数据库中有以下格式的数据:
Name Values Start_of_week End_of_week
Name1 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
Name1 1_2_2_1_2_2_1 29-Dec-19 04-Jan-20
Name1 1_2_2_2_2_2_1 05-Jan-20 11-Jan-20
Name1 1_2_2_2_2_2_1 12-Jan-20 18-Jan-20
Name1 1_2_2_2_2_2_1 19-Jan-20 25-Jan-20
Name1 1_2_2_2_2_2_1 26-Jan-20 01-Feb-20
Name1 1_2_2_2_2_2_1 02-Feb-20 08-Feb-20
Name1 1_2_2_2_2_2_1 09-Feb-20 15-Feb-20
Name1 1_2_2_2_2_2_1 16-Feb-20 22-Feb-20
Name1 1_2_2_2_2_2_1 23-Feb-20 29-Feb-20
Name1 1_2_2_2_2_2_1 01-Mar-20 07-Mar-20
Name2 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
Name2 1_2_2_2_2_2_2 29-Dec-19 04-Jan-20
Name2 1_2_2_2_2_2_2 05-Jan-20 11-Jan-20
Name2 1_2_2_2_2_2_2 12-Jan-20 18-Jan-20
Name2 1_2_2_2_2_2_2 19-Jan-20 25-Jan-20
Name2 1_2_2_2_2_2_2 26-Jan-20 01-Feb-20
Name2 1_2_2_2_2_2_2 02-Feb-20 08-Feb-20
Name2 1_2_2_2_2_2_2 09-Feb-20 15-Feb-20
Name2 1_2_2_2_2_2_2 16-Feb-20 22-Feb-20
Name2 1_2_2_2_2_2_2 23-Feb-20 29-Feb-20
Name2 1_2_2_2_2_2_2 01-Mar-20 07-Mar-20
我需要对每个名称列的值列进行比较,并更新end_of_week。例如,第一行和第二行具有不同的值列,因此不需要更新end_of_week列。第三列和第四列具有相同的值列,因此应该为第三行更新第四行的周末,结果如下所示。
然后将此行与下一行进行比较,如果值列相同,则应从下一行获取end_of_week并在此行中进行更新。对于每个name列值的每一组行,都应该发生这种情况。
我尝试使用lead()
函数比较这些行,但无法与更新后的下一组行进行比较。
Name Values start_of_week end_of_week
Name1 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
Name1 1_2_2_1_2_2_1 29-Dec-19 04-Jan-20
Name1 1_2_2_2_2_2_1 05-Jan-20 07-Mar-20
Name2 1_2_2_1_1_2_1 22-Dec-19 28-Dec-19
Name2 1_2_2_2_2_2_2 29-Dec-19 07-Mar-20
发布于 2020-01-03 23:07:03
这是一个缝隙和岛屿问题。一个简单的解决方案是行号的差异:
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);
为什么这样做有点难以解释。但是,如果您查看子查询的结果,您将看到行号的差异如何识别具有相同值的相邻行。
发布于 2020-01-04 03:20:14
从样本数据来看,我认为这不是一个差距和孤岛问题。您可以使用group by
获得所需的输出。
Select name, value,
Min(start_of_week),
Max(end_of_week)
From your_table
Group by name, value;
干杯!!
https://stackoverflow.com/questions/59586121
复制