用于在列中添加日期的SQL查询

时间:2014-05-15 03:42:22

标签: sql oracle

我有一个名为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;

但它没有给我确切的输出。

2 个答案:

答案 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