内部联接的月末数据

时间:2016-08-04 07:17:05

标签: sql oracle date join

我正在尝试根据每日数据获得最后一个月的价格。 ISIN在映射表中,日期等是内容表。我应该如何构建查询以使其有效?

select b.isin, last_Day(a.date) End_date, a.PRICE 
from MAPPING b,
     CONTENT a  
where b.ISIN in ('xxx')
  and a.date >= '31Jul2010' AND a.date <= '31Aug2010'
  and a.instid = b.instid 

我应该得到1个结果,而不是每日结果,但是在特定月份的最后一天

b.isin  last_day    a.price
xxx 31/08/2010      p1
xxx 31/08/2010      p2
xxx 31/08/2010      p3
xxx 31/08/2010      p4
xxx 31/08/2010      p5
xxx 31/08/2010      p6
xxx 31/08/2010      p7
xxx 31/08/2010      p8
xxx 31/08/2010      p9
xxx 31/08/2010      p10
xxx 31/08/2010      p11
xxx 31/08/2010      p12
xxx 31/08/2010      p13
xxx 31/08/2010      p14
xxx 31/08/2010      p15
xxx 31/08/2010      p16
xxx 31/08/2010      p17
xxx 31/08/2010      p18
xxx 31/08/2010      p19
xxx 31/08/2010      p20
xxx 31/08/2010      p21
xxx 31/08/2010      p22

我故意隐藏了isin和价格(这些不是实际结果)。 但逻辑是一样的。应该是xxx 31 / 08.2010 a.price并且每个月都有这样的选择。

1 个答案:

答案 0 :(得分:0)

这将为您提供每个月的最后一天,以及您拥有数据的最后一天的价格(如果您的数据存在差距,则可能不是该月的最后一天):

-- CTEs to generate fake data
with content (instid, a_date, price) as (
  select 42, date '2010-08-09' + level, 'p'||level
  from dual connect by level <= 22
),
mapping (instid, isin) as (
  select 42, 'xxx' from dual
)
select b.isin,
  last_day(a.a_date) as last_day,
  max(a.price) keep (dense_rank last order by a.a_date) as price
from mapping b
join content a
on a.instid = b.instid
where b.isin in ('xxx')
and a.a_date >= date '2010-07-31' AND a.a_date <= date '2010-08-31'
group by b.isin, last_day(a.a_date);

ISI LAST_DAY   PRICE                                   
--- ---------- -----------------------------------------
xxx 2010-08-31 p22                                      

以类似的方式生成7月和8月的数据,您得到:

ISI LAST_DAY   PRICE                                   
--- ---------- -----------------------------------------
xxx 2010-07-31 p22                                      
xxx 2010-08-31 p52                                      

这使用keep dense_rank分析方法查找组内的最新价格。

相关问题