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

问题描述 投票:0回答:2

我有以下表格:

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
sql oracle
2个回答
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


0
投票

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

这是您从两边获得最接近日期的示例:

ith tab_1 as (
  select 362 id, to_date('14/09/2015', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('15/09/2015', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('16/09/2015', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('05/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('06/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('07/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('08/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('23/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('24/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('25/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('30/10/2019', 'dd/mm/yyyy') dat from dual
),
 tab_2 as (
  select 362 id, to_date('01/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('07/10/2016', 'dd/mm/yyyy') dat from dual union all
  select 362 id, to_date('29/10/2016', 'dd/mm/yyyy') dat from dual
)
select 
  dat1_id,
  dat2_dat,
  dat2_dat
from (
  select 
    tab_2.id   dat1_id,
    tab_2.dat  dat1_dat,
    tab_1.dat  dat2_dat,
    row_number() over (partition by tab_2.id, tab_2.dat order by abs(tab_2.dat - tab_1.dat) asc) rn
  from
    tab_2
    inner join tab_1 
      on tab_2.id = tab_1.id
)
where rn = 1;
© www.soinside.com 2019 - 2024. All rights reserved.