我有一个ipnut,如下所示
code startdate enddate rate
f2 2016-09-01 00:00:00.000 2016-09-18 00:00:00.000 12
f2 2016-09-19 00:00:00.000 2016-09-30 00:00:00.000 8
g1 2016-09-01 00:00:00.000 2016-09-20 00:00:00.000 7
g1 2016-09-21 00:00:00.000 2016-09-30 00:00:00.000 5
jn 2016-09-01 00:00:00.000 2016-09-15 00:00:00.000 15
jn 2016-09-16 00:00:00.000 2016-09-30 00:00:00.000 10
我希望输出对应于每个startdate和enddate期间,使用oracle进行如下代码编码。
code startdate enddate rate
f2 2016-09-01 00:00:00.000 2016-09-15 00:00:00.000 12
f2 2016-09-16 00:00:00.000 2016-09-18 00:00:00.000 12
f2 2016-09-19 00:00:00.000 2016-09-20 00:00:00.000 8
f2 2016-09-21 00:00:00.000 2016-09-30 00:00:00.000 8
g1 2016-09-01 00:00:00.000 2016-09-15 00:00:00.000 7
g1 2016-09-16 00:00:00.000 2016-09-18 00:00:00.000 7
g1 2016-09-19 00:00:00.000 2016-09-20 00:00:00.000 7
g1 2016-09-21 00:00:00.000 2016-09-30 00:00:00.000 5
jn 2016-09-01 00:00:00.000 2016-09-15 00:00:00.000 15
jn 2016-09-16 00:00:00.000 2016-09-18 00:00:00.000 10
jn 2016-09-19 00:00:00.000 2016-09-20 00:00:00.000 10
jn 2016-09-21 00:00:00.000 2016-09-30 00:00:00.000 10
答案 0 :(得分:0)
如果我理解正确,你想找到给定表中的所有startdate和enddate句点,即:
+-----------+-----------+
| STARTDATE | ENDDATE |
+-----------+-----------+
| 01-SEP-16 | 15-SEP-16 |
+-----------+-----------+
| 16-SEP-16 | 18-SEP-16 |
+-----------+-----------+
| 19-SEP-16 | 20-SEP-16 |
+-----------+-----------+
| 21-SEP-16 | 30-SEP-16 |
+-----------+-----------+
然后在给定表中的期间落在上述期间内时,找出上述每个期间的费率。
试试这个:
select
t.code,
t2.startdate,
t2.enddate,
t.rate
from t inner join (
select startdate, min(enddate) enddate
from (
select distinct startdate
from t
) t1 inner join (
select distinct enddate
from t
) t2 on t1.startdate <= t2.enddate
group by startdate
) t2 on t.startdate <= t2.startdate
and t.enddate >= t2.enddate
order by 1, 2, 3, 4;