Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Join_Outer Join - Fatal编程技术网

Sql 连接两个表,其中右日期是小于或等于左日期的最大日期

Sql 连接两个表,其中右日期是小于或等于左日期的最大日期,sql,oracle,date,join,outer-join,Sql,Oracle,Date,Join,Outer Join,我有两个表要加入Oracle SQL: Table A: DATE VALUE 02-May-19 19.25 03-May-19 19.35 04-May-19 19.37 06-May-19 19.45 11-May-19 19.30 01-Jun-19 18.79 01-Jul-19 19.33 Table B: DATE VALUE 02-May-19 11.08 01-Jun-19 11.09 01-Jul-19 1

我有两个表要加入Oracle SQL:

Table A:
DATE        VALUE
02-May-19   19.25
03-May-19   19.35
04-May-19   19.37
06-May-19   19.45
11-May-19   19.30
01-Jun-19   18.79
01-Jul-19   19.33

Table B:
DATE        VALUE
02-May-19   11.08
01-Jun-19   11.09
01-Jul-19   11.11
我可以在日期匹配的地方加入这两个值:

select a."date" as "DATE", a.value as a_value, b.value as b_value
from a 
left outer join b on b."date" = a."date"
;

DATE        A_VALUE B_VALUE
02-May-19   19.25   11.08
03-May-19   19.35   
04-May-19   19.37   
06-May-19   19.45   
11-May-19   19.30   
01-Jun-19   18.79   11.09
01-Jul-19   19.33   11.11
我希望能够做到的是,在表B中不存在日期的情况下,取最佳可用的B.value,其中B.date在联接条件下使用月和年函数

select a.date, a.value, b.value 
from a 
left outer join b 
on EXTRACT(month FROM b.date)=EXTRACT(month FROM a.date) 
and EXTRACT(year FROM b.date)=EXTRACT(yearFROM a.date)
在联接条件下使用月和年函数

select a.date, a.value, b.value 
from a 
left outer join b 
on EXTRACT(month FROM b.date)=EXTRACT(month FROM a.date) 
and EXTRACT(year FROM b.date)=EXTRACT(yearFROM a.date)

也许最简单的方法是相关子查询:

select a.*,
       (select max(b.value) keep (dense_rank first order by b.date desc)
        from b
        where b.date <= a.date
       ) b_value
from a;

也许最简单的方法是相关子查询:

select a.*,
       (select max(b.value) keep (dense_rank first order by b.date desc)
        from b
        where b.date <= a.date
       ) b_value
from a;

在查询中,可以添加带有忽略空值选项的滞后函数:

select a."date"
     , a."value"
     , coalesce(b."value", lag(b."value") ignore nulls over (order by a."date")) as best_match_value
from a 
left outer join b on b."date" = a."date"
order by a."date";

在查询中,可以添加带有忽略空值选项的滞后函数:

select a."date"
     , a."value"
     , coalesce(b."value", lag(b."value") ignore nulls over (order by a."date")) as best_match_value
from a 
left outer join b on b."date" = a."date"
order by a."date";

月和年功能。。。在Oracle???@BarbarosÖzhan中,谢谢你-我没有注意到db tagmonth and year函数。。。在Oracle中???@BarbarosÖzhan,谢谢你-我没有注意到db标签