2桌
从general_data
中选择* ID | currecny | DATE_ACT
1 USD 01/12/2015
2 USD 02/12/2015
3 GBP 01/12/2015
4 GBP 03/12/2015
5 USD 06/12/2015
从currency_data
中选择* currecny | RATE_DATE | Rate
USD 04/12/2015 3.51
USD 02/12/2015 3.46
GBP 01/12/2015 4.62
USD 01/12/2015 3.50
我想将ID与其有效货币相匹配。
货币与货币名称和'日期'匹配 - 如果'currency_data'表中没有这样的日期,则应该与之前的日期匹配。
所需的输出:
ID | rate |
1 3.50
2 3.46
3 4.62
4 4.62
5 3.51
我的尝试:
SELECT gd.ID,
(SELECT rate
FROM currency_data cd
WHERE cd.currecny = gd.currecny
AND gd.date_act >= cd.rate_date
AND ROWNUM = 1
order by cd.rate_date) rate
FROM general_data gd
order by 1
订购时出现语法错误,但我需要订购以获取最新信息。
答案 0 :(得分:1)
这在Oracle中很难实现。在Oracle 12g中,您可以使用fetch first 1 row only
:
SELECT gd.ID,
(SELECT rate
FROM currency_data cd
WHERE cd.currecny = gd.currecny AND
gd.date_act >= cd.rate_date
ORDER BY cd.rate_date
FETCH FIRST 1 ROW ONLY
) rate
FROM general_data gd
ORDER BY 1;
但这仅适用于最新版本。不幸的是,使用两个子查询来使用rownum
是有问题的,因为Oracle的范围规则不允许嵌套关联。
但是,有一个解决方案:
SELECT gd.ID,
(SELECT MAX(rate) KEEP (DENSE_RANK FIRST ORDER BY cd.rate_date)
FROM currency_data cd
WHERE cd.currecny = gd.currecny AND
gd.date_act >= cd.rate_date
) rate
FROM general_data gd
ORDER BY 1;
KEEP
救援。
答案 1 :(得分:1)
SELECT gd.ID, cd.Rate
FROM general_data gd
LEFT OUTER JOIN currency_data cd
ON cd.currency = gd.currency
AND cd.rate_date =
(
SELECT max(rate_date)
FROM currency_data cd
WHERE cd.currency = gd.currency
AND cd.rate_date <= gd.date_act
)
ORDER BY 1