连接 2 个表,其中右侧日期是小于或等于左侧日期的最大日期
Join 2 tables where right date is greatest date less than or equal to left date
我有 2 table 我想加入 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
我想做的是 table 中没有日期的地方 B 取最好的 b.value where b."date" <= a ."date"。像这样:
DATE A_VALUE B_VALUE
02-May-19 19.25 11.08
03-May-19 19.35 11.08
04-May-19 19.37 11.08
06-May-19 19.45 11.08
11-May-19 19.30 11.08
01-Jun-19 18.79 11.09
01-Jul-19 19.33 11.11
在连接条件中使用 month()
和 year()
函数
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."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";
我有 2 table 我想加入 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
我想做的是 table 中没有日期的地方 B 取最好的 b.value where b."date" <= a ."date"。像这样:
DATE A_VALUE B_VALUE
02-May-19 19.25 11.08
03-May-19 19.35 11.08
04-May-19 19.37 11.08
06-May-19 19.45 11.08
11-May-19 19.30 11.08
01-Jun-19 18.79 11.09
01-Jul-19 19.33 11.11
在连接条件中使用 month()
和 year()
函数
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."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";