依赖SQL的日期
我有一个时间序列表,如下所示:依赖SQL的日期,sql,oracle,date,Sql,Oracle,Date,我有一个时间序列表,如下所示: ID Date Value 1 2016-11-01 1.0 1 2016-11-03 1.76 ... i、 e.每一个的连续值。我还有一张这样的桌子: ID class Date 1 c1 2016-11-01 1 c2 2016-12-02 1 c3 2017-02-03 ... i、 e.一个表,说明ID属于哪个类。日期表示开始应用的日期,然后应用到表中的下一行日
ID Date Value
1 2016-11-01 1.0
1 2016-11-03 1.76
...
i、 e.每一个的连续值。我还有一张这样的桌子:
ID class Date
1 c1 2016-11-01
1 c2 2016-12-02
1 c3 2017-02-03
...
i、 e.一个表,说明ID属于哪个类。日期表示开始应用的日期,然后应用到表中的下一行日期
我需要以某种方式将它们连接在一起,以便为“类”列提供完整的时间序列:
ID class Date Value
1 c1 2016-11-01 1.0
...
1 c2 2016-12-02 2.5
...
1 c3 2017-02-03 3.7
...
有没有人对如何实现这一点有好的解决方案/提示 这是一个针对Oracle的解决方案。根据需要进行调整。顶部不是解决方案的一部分,请参见代码中的注释;我用它只是为了测试。我在第一个表中又添加了一行,以确认对于第二个表中最后一个日期之后的日期,查询是否正常工作。此外,在Oracle中,日期是一个保留字,因此不应将其用作列名。我把它改成了dt
您正在使用哪些RDBMS?你的标签太多了。编辑:刚才有人在编辑中删除了它们。这篇评论根据原始帖子选择了一个DBMS,不是所有的。一些有用的关于。还有,到目前为止您尝试了什么?错误的样本数据。所有ID都有相同的值。请参见连接和Nice!!马修,干得好。谢谢。另外,在甲骨文中,日期是一个保留字——在它周围使用勾号不是和在MySQL中使用保留字一样有效吗?@Fred ii——关闭不同的语法。在Oracle中,您可以通过将标识符、表名、列名等括在双引号中来转义它们。但这是一个糟糕的做法;如果你使用双引号,那么你必须在任何地方都使用双引号,并保持相同的大小写,等等。最好养成一开始不使用表名和列名的保留字的习惯,同时如果需要,知道解决方法也是很好的。@mathguy哦,我明白了,谢谢。TBH,我对Oracle语法了解不多,但这并不能阻止我用谷歌搜索哈哈!干杯
with
your_first_table ( id, dt, value ) as (
select 1, date '2016-11-01', 1.0 from dual union all
select 1, date '2016-11-03', 1.76 from dual union all
select 1, date '2017-04-11', 2.34 from dual
),
your_second_table ( id, class, dt ) as (
select 1, 'c1', date '2016-11-01' from dual union all
select 1, 'c2', date '2016-12-02' from dual union all
select 1, 'c3', date '2017-02-03' from dual
)
-- end of test data; SQL query begins below this line
select t1.id, t2.class, t1.dt, t1.value
from your_first_table t1
left outer join
( select id, class, dt as from_dt,
lead(dt) over (partition by id order by dt) as to_dt
from your_second_table
) t2
on t1.id = t2.id
and t1.dt >= t2.from_dt
and ( t1.dt < t2.to_dt or t2.to_dt is null)
;
ID CLASS DT VALUE
---- ----- ---------- ----------
1 c1 2016-11-01 1
1 c1 2016-11-03 1.76
1 c3 2017-04-11 2.34
3 rows selected.