如何获得最后的日期和最接近的日期

时间:2019-04-11 17:05:09

标签: sql oracle

我有下表:

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

2 个答案:

答案 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

db<>fiddle


我仍然不明白您期望的输出的最后一行,但是我认为这必须接近您想要的:

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

db<>fiddle

答案 1 :(得分:0)

最近的一天可能在之前或之后。

这是您获得距双方最近的日期的示例:

@if(' and with ')