我有下表:
table_ent | table_out
cod_prod date_ent vl_prod | cod_prod date_out vl_prod
362 14/09/2015 100,00 | 362 01/10/2016 700,00
362 15/09/2015 150,00 | 362 07/10/2016 800,00
362 16/09/2015 10,00 | 362 29/10/2016 100,00
362 05/10/2016 20,00 | 362 01/10/2016 800,00
362 06/10/2016 300,00 |
362 07/10/2016 460,00 |
362 08/10/2016 510,00 |
362 23/10/2016 620,00 |
362 24/10/2016 750,00 |
362 25/10/2016 810,00 |
362 30/10/2019 920,00 |
我需要使用SQL内部联接获取最接近的日期。我已经尝试过max (date)
,但没有成功;我知道了:
cod_ent date_out vl_ent cod_ent vl_ent date_ent
------ -------- ------ --- --- -------
362 01/10/16 700 362 100 14/09/15
362 01/10/16 800 362 10 16/09/15
362 01/10/16 700 362 150 15/09/15
362 01/10/16 700 362 10 16/09/15
362 01/10/16 800 362 150 15/09/15
362 01/10/16 800 362 100 14/09/15
362 07/10/16 100 362 20 05/10/16
362 07/10/16 100 362 300 06/10/16
362 07/10/16 100 362 100 14/09/15
362 07/10/16 100 362 10 16/09/15
362 07/10/16 100 362 150 15/09/15
362 29/10/16 920 362 510 08/10/16
362 29/10/16 920 362 750 24/10/16
362 29/10/16 920 362 460 07/10/16
362 29/10/16 920 362 10 16/09/15
所需结果:
cod_ent date_out vl_ent cod_ent vl_ent date_ent
------ -------- ------ --- --- -------
362 01/10/16 700 362 10 16/09/15
362 01/10/16 800 362 10 16/09/15
362 07/10/16 100 362 300 06/10/16
362 29/10/16 920 362 750 25/10/16
答案 0 :(得分:0)
实现显示的输出的一种简单方法是使用日期比较条件将两个表连接起来-这似乎是您要追求的:
table_ent.date_ent < table_out.date_out
,然后使用汇总查找满足该条件的最长时间:
select o.cod_prod, o.date_out, e.cod_prod, max(e.date_ent) as date_ent
from table_out o
join table_ent e on e.cod_prod = o.cod_prod and e.date_ent < o.date_out
group by o.cod_prod, o.date_out, e.cod_prod
order by o.cod_prod, o.date_out;
COD_PROD DATE_OUT COD_PROD DATE_ENT
---------- ---------- ---------- ----------
362 2016-10-01 362 2015-09-16
362 2016-10-07 362 2016-10-06
362 2016-10-29 362 2016-10-25
我仍然不明白您期望的输出的最后一行,但是我认为这必须接近您想要的:
select a.cod_prod, a.date_out, a.vl_prod, b.cod_prod as cod_prod,
max(b.vl_prod) keep (dense_rank last order by b.date_ent) as vl_prod, max(b.date_ent) as date_ent
from table_out a
join table_ent b on b.cod_prod = a.cod_prod and b.date_ent < a.date_out
group by a.cod_prod, a.date_out, b.cod_prod, a.vl_prod --, b.vl_prod
order by a.cod_prod;
COD_PROD DATE_OUT VL_PROD COD_PROD VL_PROD DATE_ENT
---------- ---------- ---------- ---------- ---------- ----------
362 2016-10-01 700 362 10 2015-09-16
362 2016-10-01 800 362 10 2015-09-16
362 2016-10-07 800 362 300 2016-10-06
362 2016-10-29 100 362 810 2016-10-25
答案 1 :(得分:0)
最近的一天可能在之前或之后。
这是您获得距双方最近的日期的示例:
@if(' and with ')