我有一个名为deep_test的表,其中有A,B,C和D列。列A是主键,B,C是日期数据类型列,D是来自其他表的外键。
要求: - 我需要添加位于C列+16天和B列-16天之间的所有日期。
例如,现在我的表格中有这样的数据。
A B C D
------------------------------------
1 20.04.2014 21.04.2014 40
2 22.04.2014 22.04.2014 40
3 06.05.2014 10.05.2014 40
4 15.05.2014 30.05.2014 40
5 01.01.2014 10.01.2014 41
6 11.01.2014 25.01.2014 41
7 01.02.2014 10.02.2014 41
8 15.02.2014 20.02.2014 41
9 25.02.2014 26.02.2014 41
如果检查C柱的+16天和B柱的-16天,如果任何日期位于此范围内,则应该对作为外键的D列进行晃动,并显示以下输出。
我正在使用oracle 11i数据库。
输出为: -
B C D
---------------------------
20.04.2014 30.05.2014 40
01.01.2014 26.02.2014 41
我使用的查询是: -
SELECT X.*
FROM dummy X
WHERE ( X.date_end BETWEEN (X.date_start - 16)
AND X.date_start
OR date_start BETWEEN X.date_end
AND (X.date_end + 16) )
GROUP BY X.D;
但它没有给我确切的输出。
答案 0 :(得分:0)
猜测:
select min(B), max(C), D
from T
group by D
答案 1 :(得分:0)
因此,您希望获得允许最多16天的差距的所有相邻日期范围。
以下是如何:按D和B对记录进行排序,如果我们处于相邻的日期范围(使用LAG),则每条记录都会查看上一条记录。使用1标记每个组更改(使用CASE)。然后再次浏览记录并运行总计的组更改(使用SUM OVER),它会为您提供组编号。然后获得每组的最小开始日期和最长结束日期。
B C D group_change range_group 01.01.2014 02.01.2014 10 1 1 04.01.2014 06.01.2014 10 0 1 31.01.2014 02.01.2014 10 1 2 10.02.2014 14.02.2014 10 0 2 01.01.2014 10.01.2014 20 1 3 20.01.2014 25.01.2014 20 0 3
B C D 01.01.2014 06.01.2014 10 31.01.2014 14.02.2014 10 01.01.2014 25.01.2014 20
select min(B) as start_date, max(C) as end_date, min(D) as D
from
(
select B, C, D, sum(group_change) over (order by D, B) as range_group
from
(
select B, C, D,
case
when B - lag(C) over (partition by D order by B) <= 16 then 0
else 1
end as group_change
from mytable
)
)
group by range_group
order by min(B), D;
这是一个SQL小提琴:http://www.sqlfiddle.com/#!4/a1144/10。