如何获得最后的日期和最近的日期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得最后的日期和最近的日期相关的知识,希望对你有一定的参考价值。
我有以下表格:
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
答案
实现您显示的输出的一种简单方法是使用日期比较条件连接两个表 - 这似乎是您所追求的:
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
另一答案
最近的一天可能在之前或之后。
这是您从两边获得最接近日期的示例:
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;
以上是关于如何获得最后的日期和最近的日期的主要内容,如果未能解决你的问题,请参考以下文章