Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql在月末复制最新记录_Sql_Oracle_Plsql - Fatal编程技术网

sql在月末复制最新记录

sql在月末复制最新记录,sql,oracle,plsql,Sql,Oracle,Plsql,我需要根据每种货币的最新交易生成月底的汇率 例如,假设我们需要处理2天的汇率(该文件可能会带来x天的exch汇率),它们如下所示: 04/25/2015,GBP,USD,1.8 04/25/2015,USD,GBP,1.25 04/26/2015,GBP,USD,1.7346 04/26/2015,USD,GBP,1.1357 2015年4月25日,英镑,美元,1.8 2015年4月25日,美元,英镑,1.25 2015年4月26日,英镑,美元,1.7346 2015年4月26日,美元,英镑,1

我需要根据每种货币的最新交易生成月底的汇率

例如,假设我们需要处理2天的汇率(该文件可能会带来x天的exch汇率),它们如下所示:

04/25/2015,GBP,USD,1.8 04/25/2015,USD,GBP,1.25 04/26/2015,GBP,USD,1.7346 04/26/2015,USD,GBP,1.1357 2015年4月25日,英镑,美元,1.8 2015年4月25日,美元,英镑,1.25 2015年4月26日,英镑,美元,1.7346 2015年4月26日,美元,英镑,1.1357 在本例中,我需要在4/26获取两条记录,并在月末生成记录,因此输出需要如下所示:

04/27/2015,GBP,USD,1.7346 04/28/2015,GBP,USD,1.7346 04/29/2015,GBP,USD,1.7346 04/30/2015,GBP,USD,1.7346 04/27/2015,USD,GBP,1.1357 04/28/2015,USD,GBP,1.1357 04/29/2015,USD,GBP,1.1357 04/30/2015,USD,GBP,1.1357 2015年4月27日,英镑,美元,1.7346 2015年4月28日,英镑,美元,1.7346 2015年4月29日,英镑,美元,1.7346 2015年4月30日,英镑,美元,1.7346 2015年4月27日,美元,英镑,1.1357 2015年4月28日,美元,英镑,1.1357 2015年4月29日,美元,英镑,1.1357 2015年4月30日,美元,英镑,1.1357 我在PLSQL中所做的是以下过程,但这似乎不像我预期的那样有效

DECLARE 
 l_max_date date;

 CURSOR C1 IS
 SELECT         FROM_CURRENCY_DATE,
                FROM_CURRENCY,
                TO_CURRENCY, 
                NUMERATOR_BUY,
                CONVERSION_RATE,
                LEAD(conversion_rate) OVER (PARTITION BY from_currency ORDER BY from_currency_date) AS LEAD_conversion_rate,                
                ROW_NUMBER() OVER (PARTITION BY from_currency ORDER BY from_currency_date DESC) AS rn
        FROM    exchange_rate_staging_tbl
        WHERE   valid_flag is null or valid_flag <> 'E';

cur_rec c1%rowtype;

BEGIN 

 SELECT MAX(from_currency_date)
 INTO l_max_date
 FROM exchange_rate_staging_tbl;


 FOR cur_rec IN c1 LOOP

   if cur_rec.lead_conversion_rate is null then -->Null means it is the latest transaction
   dbms_output.put_line(cur_rec.from_currency||' '||
                       cur_rec.to_currency||' '||
                       'Inside IF'||' '||
                       cur_rec.conversion_rate);
   ELSE --> Records here are not the latest transaction but they still need to be inserted with their respective exch rate
   --dbms_output.put_line(l_max_date||last_day(l_max_date)); 
   dbms_output.put_line(cur_rec.from_currency||' '||
                       cur_rec.to_currency||' '||
                       'Inside Else'||' '||
                       cur_rec.conversion_rate);
   END IF;

  l_max_date := l_max_date+1; 
  END LOOP; 
 END; 
声明
l_max_日期;
光标C1为
从\u货币\u日期中选择,
从货币来看,
要使用货币,
分子_-BUY,
换算率,
提前期(换算率)超过(按自币种顺序除以自币种日期)作为提前期换算率,
行号()在(按自货币顺序按自货币日期描述划分)上作为rn
从汇率到分期付款
其中有效_标志为null或有效_标志“E”;
当前记录c1%行类型;
开始
选择最大值(从\u货币\u日期)
进入l_max_日期
从汇率到分期付款;
对于c1回路中的cur_rec
如果cur_rec.lead_conversion_rate为null,则-->null表示它是最新的事务
dbms|u output.put|u line(cur|u rec.from|u currency|||
货币兑换||
“内部如果”| |”||
电流记录转换率);
ELSE-->此处的记录不是最新的交易记录,但仍需要插入它们各自的exch汇率
--dbms_output.put_line(l_max_date |最后一天(l_max_date));
dbms|u output.put|u line(cur|u rec.from|u currency|||
货币兑换||
“其他内部”| |”||
电流记录转换率);
如果结束;
l_max_date:=l_max_date+1;
端环;
终止
上述程序输出:

2015年4月25日英镑USD 2015年4月25日内其他1.8

2015年4月26日英镑美元2015年4月26日内IF 1.7346


如何使用SQL或PLSQL根据月末每种货币的最新交易生成记录。

此查询看起来很有希望:

with 
  dm as (select max(from_currency_date) d from exchange_rate_staging_tbl),
  dr as (select distinct from_currency fc, to_currency tc,
      last_value(conversion_rate ignore nulls) over 
        (partition by from_currency, to_currency order by from_currency_date 
        rows between unbounded preceding and unbounded following) rate
    from exchange_rate_staging_tbl, dm where from_currency_date = dm.d),
  days as (select d+level-1 day from dm connect by d+level-1 <= last_day(d))
select days.day, dr.fc, dr.tc, rate
  from days cross join dr 

此查询显示从给定日期(您在第一行中定义)到月末的数据,以填补空缺- 假设我们没有周六和周日的转换率,查询用周五的数据填补了这个空白


函数查找转换率的最后一个值 从某种程度上分组(分区)的某组值。在我们的例子中,这些分区是成对的货币,顺序是货币\日期。 用人工的话来说:查找给定期间内每对货币的最后一个非空转换率值。请注意,每行的周期都会发生变化
Last_value
是一种用途非常广泛的分析函数。
关于这些函数的好文章:。

您的数据看起来不像我见过的任何速率数据。通常,所有内容都参照一种货币。就我而言,是美元。现在,每种货币每天只需要一个条目。像这样:

Effective  Code Factor
2015-05-02 GBP  0.662251656 --based on today's rate of 1.51 GBP->USD
从美元到英镑:美元*系数=英镑
从英镑到美元:英镑/系数=美元

有一张幻灯片展示了这种桌子的设计。货币讨论从幻灯片/第12页开始,查询从第16页开始。桌子的设计很简单:

create table XRates(
    Code       char( 3 ) not null,
    Effective  date not null,
    Factor     decimal( 12, 9 ) not null
    constraint PK_XRates primary key( Code, Effective )
);

该设计有两个很好的特点,即您可以在同一个表中维护历史费率,并且不需要每日输入。只有在费率发生变化时才进行输入。查询返回给定日期的有效汇率,即使该汇率是由一周前的条目确定的(在今天的货币市场中不太可能)。

获取缺失日期列表(例如,通过递归查询),选择最大日期和值或此日期,加入并插入我用所有研究和代码编辑的帖子。你能详细解释一下你的评论吗?我运行了你的查询,我认为它是有效的,但我注意到它缺少4/25的信息。它带来了4/26,一直持续到月底(这也是我所需要的)。除此之外,还需要反映4/25。我怎样才能保持4/25的对话率?我已经编辑了答案,请看下半部分。还更正了第一部分中指向SQLFiddle的链接。非常感谢@Pound Stibbons,您的上一个查询似乎按预期工作。另外,您发送的链接非常有用。您能否详细介绍一下
last\u value(转换率忽略空值)在查询中的作用(按from\u currency进行划分,按from\u currency顺序,按from\u currency\u日期行在无界前后之间)rate
很乐意提供帮助。我添加了
最后一个值的解释,请参见答案中的最后一次编辑。对不起,有语言错误,英语不是我的主要语言。
create table XRates(
    Code       char( 3 ) not null,
    Effective  date not null,
    Factor     decimal( 12, 9 ) not null
    constraint PK_XRates primary key( Code, Effective )
);