【问题标题】:end of month data with inner join带有内部连接的月末数据
【发布时间】:2016-08-04 07:17:04
【问题描述】:

我正在尝试根据每日数据获取每月最后一天的价格。 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 和这样的每个月的选择范围。

【问题讨论】:

  • 今天的提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 您没有显示产生该输出的原始数据;每个日期有一行吗?每个月的最后一天是否总是(确切地)一行?
  • 是的,每个日期正好一行。价格总是不同的,ISIN 总是一样的。由于数据库中的价格是每天的,我想获得特定时间范围(例如 3 年)的每月数据。感谢您的输入,我将在下面尝试您的解决方案。

标签: sql oracle date join


【解决方案1】:

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

-- 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 分析方法来查找组内的最新价格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多