sql在月末复制最新记录
我需要根据每种货币的最新交易生成月底的汇率 例如,假设我们需要处理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中所做的是以下过程,但这似乎不像我预期的那样有效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
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 )
);