Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
依赖SQL的日期_Sql_Oracle_Date - Fatal编程技术网

依赖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.